設(shè)計(jì)專業(yè)干貨推薦網(wǎng)站代發(fā)軟文
一.K-近鄰(KNN)
- K-近鄰(K-Nearest Neighbors, 簡稱 KNN)是一種基于實(shí)例的學(xué)習(xí)算法,主要用于分類和回歸問題。KNN 的工作原理直觀且簡單,它基于相似性進(jìn)行預(yù)測,也就是說給定一個(gè)新的數(shù)據(jù)點(diǎn),KNN 算法會查找距離最近的 K 個(gè)數(shù)據(jù)點(diǎn),然后通過這些鄰居來確定新數(shù)據(jù)點(diǎn)的類別(在分類任務(wù)中)或數(shù)值(在回歸任務(wù)中)。
KNN 的工作原理
-
選擇 K 值:
- K 是算法中的一個(gè)超參數(shù),表示在做出預(yù)測時(shí)要參考的最近鄰居的數(shù)量。常見的取值是 3、5、7 等。
- K 值的選擇直接影響模型性能。較小的 K 值使模型對局部噪聲更敏感,而較大的 K 值則會使模型過于平滑,可能會錯(cuò)過局部模式。
-
計(jì)算距離:
- 常用的距離度量方式是歐幾里得距離,也可以使用曼哈頓距離、閔可夫斯基距離等。
- 歐幾里得距離公式:
d = ∑ i = 1 n ( x i ? y i ) 2 d = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2} d=i=1∑n?(xi??yi?)2?
其中,x 和 y 是兩個(gè)數(shù)據(jù)點(diǎn), n 是特征的數(shù)量。
-
確定最近的 K 個(gè)鄰居:
- 根據(jù)計(jì)算得到的距離,選出距離最近的 K 個(gè)點(diǎn)作為鄰居。
-
分類(對于分類問題):
- 在分類任務(wù)中,KNN 通過讓 K 個(gè)最近鄰居中的多數(shù)投票來決定新數(shù)據(jù)點(diǎn)的類別。
- 例如,如果在 K=5 的情況下,有 3 個(gè)鄰居屬于類別 A,2 個(gè)屬于類別 B,那么預(yù)測結(jié)果將是類別 A。
-
回歸(對于回歸問題):
- 在回歸任務(wù)中,KNN 通過計(jì)算 K 個(gè)最近鄰居的平均值(或加權(quán)平均值)來預(yù)測新數(shù)據(jù)點(diǎn)的數(shù)值。
KNN 算法的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 簡單直觀,易于理解和實(shí)現(xiàn)。
- 不需要訓(xùn)練階段,屬于“懶惰學(xué)習(xí)”(Lazy Learning),即模型在訓(xùn)練階段幾乎不做計(jì)算,預(yù)測時(shí)才進(jìn)行計(jì)算。
- 可用于多類別分類問題。
缺點(diǎn):
- 計(jì)算復(fù)雜度高:由于在預(yù)測時(shí)需要計(jì)算每個(gè)數(shù)據(jù)點(diǎn)與新數(shù)據(jù)點(diǎn)的距離,特別是在數(shù)據(jù)量大時(shí),計(jì)算開銷較大。
- 對數(shù)據(jù)的標(biāo)度敏感:特征的不同標(biāo)度(如度量單位不同)可能會影響距離計(jì)算,因此通常需要對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化或歸一化。
- 對噪聲敏感:K 值較小時(shí),噪聲點(diǎn)可能會對結(jié)果產(chǎn)生較大影響。
適用場景
- 小數(shù)據(jù)集:由于 KNN 的計(jì)算開銷較大,它更適合于小型數(shù)據(jù)集。
- 多類別分類:KNN 可以很好地處理多類別分類問題。
- 實(shí)例具有自然分組的情況:如果數(shù)據(jù)本身具有天然的分組或簇結(jié)構(gòu),KNN 能夠很好地捕捉這些模式。
KNN 算法的代碼示例(分類任務(wù))
下面是一個(gè)簡單的 KNN 分類任務(wù)代碼示例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# 加載數(shù)據(jù)集
data = load_iris()
X = data.data
y = data.target# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 初始化KNN分類器,設(shè)置K=3
knn = KNeighborsClassifier(n_neighbors=3)# 訓(xùn)練模型
knn.fit(X_train, y_train)# 預(yù)測
y_pred = knn.predict(X_test)# 計(jì)算準(zhǔn)確率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型準(zhǔn)確率: {accuracy}")
KNeighborsClassifier
參數(shù)詳細(xì)解釋
-
n_neighbors
:- 解釋: 指定參與投票的最近鄰居的數(shù)量,即 K 值。
- 類型: 整數(shù)。
- 默認(rèn)值: 5。
- 作用: 決定了模型在分類時(shí)會考慮多少個(gè)最近鄰居。例如,
n_neighbors=3
表示將選擇距離最近的 3 個(gè)樣本進(jìn)行投票。 - 示例:
n_neighbors=3
-
weights
:- 解釋: 決定如何計(jì)算每個(gè)鄰居的投票權(quán)重。常見的選項(xiàng)有:
'uniform'
: 所有鄰居的權(quán)重相等。'distance'
: 根據(jù)距離進(jìn)行加權(quán),距離越近的鄰居權(quán)重越高。- 自定義函數(shù):可以傳入一個(gè)用戶定義的函數(shù),基于該函數(shù)計(jì)算權(quán)重。
- 類型: 字符串或可調(diào)用函數(shù)。
- 默認(rèn)值:
'uniform'
。 - 作用: 影響分類決策。如果選擇
'distance'
,那么更近的鄰居對分類結(jié)果影響更大。 - 示例:
weights='distance'
- 解釋: 決定如何計(jì)算每個(gè)鄰居的投票權(quán)重。常見的選項(xiàng)有:
-
algorithm
:- 解釋: 用于計(jì)算最近鄰居的算法,有以下幾種選擇:
'auto'
: 自動選擇最合適的算法(根據(jù)數(shù)據(jù)的特征選擇)。'ball_tree'
: 使用 Ball Tree 數(shù)據(jù)結(jié)構(gòu),適合高維數(shù)據(jù)。'kd_tree'
: 使用 KD Tree 數(shù)據(jù)結(jié)構(gòu),適合低維數(shù)據(jù)。'brute'
: 直接進(jìn)行暴力搜索,計(jì)算所有點(diǎn)的距離。
- 類型: 字符串。
- 默認(rèn)值:
'auto'
。 - 作用: 控制最近鄰居搜索的速度和內(nèi)存效率,通常建議使用默認(rèn)的
'auto'
選項(xiàng)。 - 示例:
algorithm='kd_tree'
- 解釋: 用于計(jì)算最近鄰居的算法,有以下幾種選擇:
-
leaf_size
:- 解釋: 指定 Ball Tree 或 KD Tree 的葉子節(jié)點(diǎn)大小,影響樹的構(gòu)建和查詢速度。較小的葉子節(jié)點(diǎn)通常會帶來更快的查詢速度,但會消耗更多的內(nèi)存。
- 類型: 整數(shù)。
- 默認(rèn)值: 30。
- 作用: 在使用
'ball_tree'
或'kd_tree'
算法時(shí),可以調(diào)整該值以優(yōu)化查詢性能。 - 示例:
leaf_size=20
-
p
:- 解釋: 當(dāng)使用
minkowski
距離度量時(shí),定義了距離公式中的冪指數(shù):- 當(dāng)
p=1
時(shí),使用曼哈頓距離(L1)。 - 當(dāng)
p=2
時(shí),使用歐幾里得距離(L2)。
- 當(dāng)
- 類型: 整數(shù)。
- 默認(rèn)值: 2。
- 作用: 控制距離的計(jì)算方式,可以根據(jù)數(shù)據(jù)特性調(diào)整該參數(shù)。
- 示例:
p=1
(使用曼哈頓距離)
- 解釋: 當(dāng)使用
-
metric
:- 解釋: 指定距離度量的方式。常用選項(xiàng)有:
'minkowski'
: 閔可夫斯基距離,是歐幾里得距離和曼哈頓距離的泛化形式。'euclidean'
: 歐幾里得距離,等同于minkowski
距離與p=2
的組合。'manhattan'
: 曼哈頓距離,等同于minkowski
距離與p=1
的組合。- 其他度量方法如
'chebyshev'
或自定義距離函數(shù)。
- 類型: 字符串或可調(diào)用函數(shù)。
- 默認(rèn)值:
'minkowski'
。 - 作用: 控制如何計(jì)算樣本之間的距離,影響最近鄰居的選擇。
- 示例:
metric='euclidean'
- 解釋: 指定距離度量的方式。常用選項(xiàng)有:
-
metric_params
:- 解釋: 距離度量函數(shù)的附加參數(shù)(可選)。如果使用自定義的距離函數(shù),可以通過這個(gè)參數(shù)傳遞額外信息。
- 類型: 字典或
None
。 - 默認(rèn)值:
None
。 - 作用: 用于在自定義度量函數(shù)時(shí),提供額外的控制參數(shù)。
- 示例:
metric_params={'w': [1, 2, 3]}
(示例自定義權(quán)重)
-
n_jobs
:- 解釋: 用于并行處理最近鄰居搜索的線程數(shù)量。如果設(shè)置為
-1
,則使用所有可用的 CPU 核心進(jìn)行計(jì)算。 - 類型: 整數(shù)。
- 默認(rèn)值:
None
(使用單個(gè) CPU 核心)。 - 作用: 在大數(shù)據(jù)集上可以使用多線程加速計(jì)算,縮短模型訓(xùn)練和預(yù)測時(shí)間。
- 示例:
n_jobs=-1
- 解釋: 用于并行處理最近鄰居搜索的線程數(shù)量。如果設(shè)置為
二.K-折交叉驗(yàn)證
K-折交叉驗(yàn)證(K-Fold Cross-Validation)是一種常用的模型評估方法,廣泛用于機(jī)器學(xué)習(xí)中。它通過將數(shù)據(jù)集劃分為 K 個(gè)相同大小的子集(稱為“折”),來多次訓(xùn)練和測試模型,從而獲得更穩(wěn)定和可靠的性能評估。
工作原理
-
劃分?jǐn)?shù)據(jù)集:
- 將整個(gè)數(shù)據(jù)集隨機(jī)劃分成 K 個(gè)等大小的子集。每個(gè)子集稱為一個(gè)“折”。
-
訓(xùn)練和驗(yàn)證:
- 在每次迭代中,選擇其中一個(gè)折作為驗(yàn)證集,剩余的 K-1 個(gè)折作為訓(xùn)練集。
- 這個(gè)過程會重復(fù) K 次,每次選擇不同的折作為驗(yàn)證集,其余折作為訓(xùn)練集。
-
計(jì)算平均性能:
- 每次迭代都會得到一個(gè)模型的性能度量(如準(zhǔn)確率、F1 分?jǐn)?shù)等)。最終將 K 次迭代的性能結(jié)果進(jìn)行平均,得到整體的模型性能。
優(yōu)點(diǎn)
- 穩(wěn)定的性能評估: 通過多次迭代,K-折交叉驗(yàn)證減小了模型評估中的隨機(jī)性,得到的結(jié)果更具穩(wěn)定性。
- 充分利用數(shù)據(jù): 每一個(gè)樣本都在不同的折中被用作訓(xùn)練和驗(yàn)證集,避免了數(shù)據(jù)浪費(fèi)。
參數(shù)選擇
- K 的取值: K 通常取值為 5 或 10,這兩種配置在大多數(shù)應(yīng)用中效果較好。較小的 K 值(如 2 或 3)會導(dǎo)致較大的方差,而較大的 K 值(如 20)則增加了計(jì)算開銷。
- Shuffle(可選): 在劃分?jǐn)?shù)據(jù)集之前,可以選擇對數(shù)據(jù)進(jìn)行洗牌(shuffle),以確保每個(gè)折的樣本分布更隨機(jī)。
代碼示例
下面是一個(gè)使用 scikit-learn 實(shí)現(xiàn) K-折交叉驗(yàn)證的示例:
from sklearn.model_selection import KFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np# 加載數(shù)據(jù)集
data = load_iris()
X = data.data
y = data.target# 初始化K折交叉驗(yàn)證
kf = KFold(n_splits=5, shuffle=True, random_state=42)# 存儲每折的準(zhǔn)確率
accuracies = []# 執(zhí)行交叉驗(yàn)證
for train_index, test_index in kf.split(X):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]# 初始化并訓(xùn)練模型model = LogisticRegression(max_iter=200)model.fit(X_train, y_train)# 預(yù)測并計(jì)算準(zhǔn)確率y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)accuracies.append(accuracy)# 輸出結(jié)果
print(f"每折的準(zhǔn)確率: {accuracies}")
print(f"平均準(zhǔn)確率: {np.mean(accuracies)}")
解釋
-
KFold(n_splits=5, shuffle=True, random_state=42)
:n_splits=5
指定將數(shù)據(jù)集劃分為 5 個(gè)折。shuffle=True
表示在分割數(shù)據(jù)之前打亂數(shù)據(jù),以確保每個(gè)折的樣本分布更加隨機(jī)。random_state=42
確保結(jié)果的可重復(fù)性。
-
kf.split(X)
:- 生成訓(xùn)練集和測試集的索引。對于每一折,都會用不同的折作為測試集。
三.分層k-折交叉驗(yàn)證(Stratified k-fold)
StratifiedKFold
參數(shù)
-
n_splits
:- 解釋: 指定將數(shù)據(jù)集劃分成多少個(gè)折(子集)。
- 類型: 整數(shù)。
- 默認(rèn)值: 5。
- 示例:
n_splits=5
表示數(shù)據(jù)將被分成 5 個(gè)折。
-
shuffle
:- 解釋: 指定是否在分割之前對數(shù)據(jù)進(jìn)行洗牌(打亂順序)。如果為
True
,則在分割數(shù)據(jù)之前會對數(shù)據(jù)進(jìn)行打亂,減少樣本順序?qū)δP驮u估的影響。 - 類型: 布爾值。
- 默認(rèn)值:
False
。 - 示例:
shuffle=True
表示在分割之前打亂數(shù)據(jù)。
- 解釋: 指定是否在分割之前對數(shù)據(jù)進(jìn)行洗牌(打亂順序)。如果為
-
random_state
:- 解釋: 用于控制隨機(jī)數(shù)生成器的種子,確保結(jié)果的可重復(fù)性。當(dāng)
shuffle=True
時(shí)使用。 - 類型: 整數(shù)或
None
。 - 默認(rèn)值:
None
。 - 示例:
random_state=42
確保在每次運(yùn)行時(shí)數(shù)據(jù)劃分的一致性。
- 解釋: 用于控制隨機(jī)數(shù)生成器的種子,確保結(jié)果的可重復(fù)性。當(dāng)
-
min_groups
(僅在 scikit-learn 版本 0.24 及以后版本中可用):- 解釋: 用于指定每個(gè)折中樣本的最小組數(shù)。主要用于對分層 K-折交叉驗(yàn)證的樣本量進(jìn)行控制,確保每一折中至少有指定數(shù)量的組。
- 類型: 整數(shù)。
- 默認(rèn)值: 1。
- 示例:
min_groups=5
表示每個(gè)折中至少包含 5 個(gè)組。
使用示例
from sklearn.model_selection import StratifiedKFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np# 加載數(shù)據(jù)集
data = load_iris()
X = data.data
y = data.target# 初始化分層K折交叉驗(yàn)證
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)# 存儲每折的準(zhǔn)確率
accuracies = []# 執(zhí)行交叉驗(yàn)證
for train_index, test_index in skf.split(X, y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]# 初始化并訓(xùn)練模型model = LogisticRegression(max_iter=200)model.fit(X_train, y_train)# 預(yù)測并計(jì)算準(zhǔn)確率y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)accuracies.append(accuracy)# 輸出結(jié)果
print(f"每折的準(zhǔn)確率: {accuracies}")
print(f"平均準(zhǔn)確率: {np.mean(accuracies)}")
四.模型與加載
在 scikit-learn 中,保存和加載模型通常使用 joblib
或 pickle
。joblib
是 scikit-learn 推薦的方式,因?yàn)樗谔幚泶笮湍P?#xff08;如包含大量數(shù)組的模型)時(shí)效率更高。
1. 使用 joblib
保存和加載模型
模型保存
import joblib# 保存模型到文件
joblib.dump(knn, 'knn_model.pkl')
模型加載
# 從文件加載模型
loaded_model = joblib.load('knn_model.pkl')# 使用加載的模型進(jìn)行預(yù)測
y_pred = loaded_model.predict(X_test)
2. 使用 pickle
保存和加載模型
模型保存
import pickle# 保存模型到文件
with open('knn_model.pkl', 'wb') as file:pickle.dump(knn, file)
模型加載
# 從文件加載模型
with open('knn_model.pkl', 'rb') as file:loaded_model = pickle.load(file)# 使用加載的模型進(jìn)行預(yù)測
y_pred = loaded_model.predict(X_test)
總結(jié)
joblib
更適合包含大量數(shù)組的模型。pickle
適用于一般情況下的模型保存和加載。
五.超參數(shù)搜索
- 超參數(shù)搜索(Hyperparameter Tuning)是機(jī)器學(xué)習(xí)模型優(yōu)化的重要步驟。不同的超參數(shù)配置會對模型的性能產(chǎn)生顯著影響,因此找到最優(yōu)的超參數(shù)組合對于提升模型性能至關(guān)重要。
class sklearn.model_selection.GridSearchCV(estimator, param_grid)
說明:
同時(shí)進(jìn)行交叉驗(yàn)證(CV)、和網(wǎng)格搜索(GridSearch),GridSearchCV實(shí)計(jì)上也是一個(gè)估計(jì)器(estimator),同時(shí)它有幾個(gè)重要屬性:
best_params_ 最佳參數(shù)
best_score_ 在訓(xùn)練集中的準(zhǔn)確率
best_estimator_ 最佳估計(jì)器
cv_results_ 交叉驗(yàn)證過程描述
best_index_最佳k在列表中的下標(biāo)
完整示例代碼
# best_params_ 最佳參數(shù)# best_score_ 在訓(xùn)練集中的準(zhǔn)確率# best_estimator_ 最佳估計(jì)器# cv_results_ 交叉驗(yàn)證過程描述# best_index_最佳k在列表中的下標(biāo)from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler #標(biāo)準(zhǔn)化
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier #KNN
from sklearn.model_selection import GridSearchCV #超參數(shù)GridSearchCV
from sklearn.decomposition import PCA #PCA降維
import pandas as pddata = load_wine()#數(shù)據(jù)結(jié)構(gòu)
x = pd.DataFrame(data.data,columns=data.feature_names)#標(biāo)準(zhǔn)化
tr = StandardScaler()
x2 = tr.fit_transform(x)#數(shù)據(jù)結(jié)構(gòu)
data2 = pd.DataFrame(x2,columns=data.feature_names)#PCA降維
transfer1 = PCA(n_components=0.5)
data2 = transfer1.fit_transform(data2)x_train,x_test,y_train,y_test = train_test_split(data2,data.target,test_size=0.2,random_state=33)#創(chuàng)建模型
param = {'n_neighbors':[1,2,3,4,5,6,7,8,9,10]}#knn
model = KNeighborsClassifier()
model = GridSearchCV(model,param)
model.fit(x_train,y_train)#預(yù)測
predict = model.predict(x_test)score = model.score(x_test,y_test)print("最佳模型:", model.best_estimator_)
print("最佳參數(shù):\n",model.best_params_)
print("最佳k在列表中的下標(biāo):\n",model.best_index_)
print("在訓(xùn)練集中的準(zhǔn)確率:\n",model.best_score_)
print("最佳估計(jì)器:\n",model.best_estimator_)
print("交叉驗(yàn)證過程描述:\n",model.cv_results_)
總結(jié)
best_params_
:最優(yōu)的超參數(shù)組合。best_score_
:在交叉驗(yàn)證中的最佳平均得分。best_estimator_
:使用最佳超參數(shù)組合訓(xùn)練的模型。cv_results_
:交叉驗(yàn)證過程中所有超參數(shù)組合的詳細(xì)結(jié)果。best_index_
:最優(yōu)超參數(shù)組合在結(jié)果中的索引。
這些屬性為你提供了全面的模型優(yōu)化信息,幫助你選擇和評估最佳模型。
實(shí)例:葡萄酒–分層k-折交叉驗(yàn)證
from sklearn.datasets import load_wine
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.model_selection import StratifiedKFold
import pandas as pd
import numpy as np
#加載數(shù)據(jù)
data = load_wine()X = pd.DataFrame(data=data.data,columns=data.feature_names)#標(biāo)準(zhǔn)化
transfer = StandardScaler()
X1 = transfer.fit_transform(X)
X2 = pd.DataFrame(X1,columns=data.feature_names)#降維
transfer1 = PCA(n_components=0.5)
data1 = transfer1.fit_transform(X2)#分層k-折交叉驗(yàn)證Stratified k-fold
skf = StratifiedKFold(n_splits=10,shuffle=True,random_state=2)#儲存每折準(zhǔn)確率
accuracies = []for train_index,test_index in skf.split(data1,data.target):x_train,x_test = data1[train_index],data1[test_index]y_train,y_test = data.target[train_index],data.target[test_index]#K近鄰模型estimator = KNeighborsClassifier(n_neighbors=9)estimator.fit(x_train,y_train)#預(yù)測y_predict = estimator.predict(x_test)# print("y_predict:\n",y_test ==y_predict)#計(jì)算準(zhǔn)確率score = estimator.score(x_test,y_test)accuracies.append(score)print(accuracies)
print(np.mean(accuracies))
實(shí)例2 葡萄酒–K-折交叉驗(yàn)證(K-fold)
from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.decomposition import PCA
import pandas as pd
import joblibdata = load_wine()x = pd.DataFrame(data.data,columns=data.feature_names)#標(biāo)準(zhǔn)化
sta = StandardScaler()
x1 = sta.fit_transform(x)x2 = pd.DataFrame(x1,columns=data.feature_names)#降維
tra = PCA(n_components=0.6)data1 = tra.fit_transform(x2)kf = KFold(n_splits=10,shuffle=True,random_state=33)
#標(biāo)準(zhǔn)化
accuracies =[]
best_accuracy = 0
best_model = Nonefor train_index,test_index in kf.split(data1,data.target):x_train,x_test = data1[train_index],data1[test_index]y_train,y_test = data.target[train_index],data.target[test_index]#創(chuàng)建模型model = KNeighborsClassifier(n_neighbors=7)model.fit(x_train,y_train)#預(yù)測predict = model.predict(x_test)#準(zhǔn)確率score = model.score(x_test,y_test)accuracies.append(score)if score > best_accuracy:best_accuracy = scorebest_model = model# print("模型評估率:\n",accuracies)
# print("平均得分:\n",np.mean(accuracies))joblib.dump(best_model,'./src/KNNmodel.pkl')
# 輸出結(jié)果
print(f"每折的準(zhǔn)確率: {accuracies}")
print(f"最高準(zhǔn)確率: {best_accuracy}")
實(shí)例:mytool 函數(shù)的功能
mytool 函數(shù)的功能是計(jì)算一個(gè)文本數(shù)據(jù)集中每個(gè)詞的 TF-IDF 值。TF-IDF 是一種常用的文本挖掘方法,用于衡量一個(gè)詞在文檔中的重要性。
import math
from collections import defaultdict def calculate_tfidf(data): total_documents = len(data) word_document_count = defaultdict(int) # 統(tǒng)計(jì)每個(gè)詞在文檔中出現(xiàn)的次數(shù) for document in data: unique_words = set(document.split()) for word in unique_words: word_document_count[word] += 1 tfidf_matrix = [] # 計(jì)算每個(gè)文檔的TF-IDF for document in data: word_list = document.split() total_words = len(word_list) tfidf_scores = [] for word in set(word_list): TF = word_list.count(word) / total_words IDF = math.log(total_documents / (1 + word_document_count[word])) tfidf_scores.append(TF * IDF) tfidf_matrix.append(tfidf_scores) return tfidf_matrix # 示例使用
data = ['世界 你好 我 是 華清 遠(yuǎn)見 的 張三','你好 世界 我 是 李四 世界','華清 遠(yuǎn)見 666'
] result = calculate_tfidf(data)
print(result)