版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):K-近鄰算法原理與應(yīng)用1機(jī)器學(xué)習(xí):K-近鄰算法(KNN)1.1簡(jiǎn)介1.1.1KNN算法概述K-近鄰算法(K-NearestNeighbors,KNN)是一種基于實(shí)例的學(xué)習(xí)方法,它不進(jìn)行顯式的訓(xùn)練過程,而是將數(shù)據(jù)集中的每個(gè)樣本作為學(xué)習(xí)的“實(shí)例”。當(dāng)有新的輸入數(shù)據(jù)時(shí),KNN算法會(huì)計(jì)算這個(gè)新數(shù)據(jù)與訓(xùn)練集中每個(gè)樣本的距離,然后選取距離最近的K個(gè)樣本,根據(jù)這K個(gè)樣本的類別來預(yù)測(cè)新數(shù)據(jù)的類別。如果用于分類,那么新數(shù)據(jù)的類別將由這K個(gè)最近鄰樣本中出現(xiàn)次數(shù)最多的類別決定;如果用于回歸,那么新數(shù)據(jù)的預(yù)測(cè)值將是這K個(gè)最近鄰樣本的平均值。1.1.1.1代碼示例:KNN分類fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.neighborsimportKNeighborsClassifier
importnumpyasnp
#加載數(shù)據(jù)
iris=load_iris()
X=iris.data
y=iris.target
#劃分訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
#創(chuàng)建KNN分類器實(shí)例
knn=KNeighborsClassifier(n_neighbors=3)
#訓(xùn)練模型
knn.fit(X_train,y_train)
#預(yù)測(cè)
y_pred=knn.predict(X_test)
#計(jì)算準(zhǔn)確率
accuracy=np.mean(y_pred==y_test)
print("Accuracy:",accuracy)1.1.2KNN算法在機(jī)器學(xué)習(xí)中的地位KNN算法在機(jī)器學(xué)習(xí)中占據(jù)著基礎(chǔ)且重要的地位。它是一種非參數(shù)學(xué)習(xí)方法,這意味著它不需要假設(shè)數(shù)據(jù)的分布形式,可以適用于各種類型的數(shù)據(jù)。KNN算法易于理解和實(shí)現(xiàn),是初學(xué)者接觸機(jī)器學(xué)習(xí)分類和回歸問題的良好起點(diǎn)。然而,KNN算法的計(jì)算復(fù)雜度較高,特別是在數(shù)據(jù)量大時(shí),需要計(jì)算新樣本與所有訓(xùn)練樣本的距離,這可能導(dǎo)致預(yù)測(cè)速度較慢。此外,KNN算法對(duì)K值的選擇和距離度量方式較為敏感,選擇不當(dāng)可能會(huì)影響預(yù)測(cè)結(jié)果的準(zhǔn)確性。1.2原理與應(yīng)用1.2.1KNN算法的原理KNN算法的核心思想是“近朱者赤,近墨者黑”,即新樣本的類別或值將由其最近的鄰居決定。算法首先計(jì)算新樣本與訓(xùn)練集中每個(gè)樣本的距離,然后選取距離最近的K個(gè)樣本。對(duì)于分類問題,新樣本的類別將由這K個(gè)最近鄰樣本中出現(xiàn)次數(shù)最多的類別決定;對(duì)于回歸問題,新樣本的預(yù)測(cè)值將是這K個(gè)最近鄰樣本的平均值。1.2.1.1距離度量在KNN算法中,距離度量是關(guān)鍵步驟之一。常用的距離度量方式有歐氏距離、曼哈頓距離和閔可夫斯基距離等。例如,歐氏距離的計(jì)算公式為:d1.2.2KNN算法的應(yīng)用KNN算法可以應(yīng)用于多種場(chǎng)景,包括但不限于:-分類問題:如手寫數(shù)字識(shí)別、文本分類等。-回歸問題:如預(yù)測(cè)房?jī)r(jià)、股票價(jià)格等。-推薦系統(tǒng):基于用戶的歷史行為,推薦相似用戶喜歡的項(xiàng)目。-異常檢測(cè):通過分析新樣本與訓(xùn)練樣本的距離,識(shí)別出可能的異常數(shù)據(jù)。1.2.2.1示例:使用KNN進(jìn)行手寫數(shù)字識(shí)別fromsklearn.datasetsimportfetch_openml
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.metricsimportclassification_report,confusion_matrix
#加載MNIST數(shù)據(jù)集
mnist=fetch_openml('mnist_784')
X,y=mnist['data'],mnist['target']
#劃分訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
#創(chuàng)建KNN分類器實(shí)例
knn=KNeighborsClassifier(n_neighbors=3)
#訓(xùn)練模型
knn.fit(X_train,y_train)
#預(yù)測(cè)
y_pred=knn.predict(X_test)
#輸出分類報(bào)告和混淆矩陣
print("ClassificationReport:\n",classification_report(y_test,y_pred))
print("ConfusionMatrix:\n",confusion_matrix(y_test,y_pred))通過上述代碼,我們可以使用KNN算法對(duì)MNIST手寫數(shù)字?jǐn)?shù)據(jù)集進(jìn)行分類,輸出的分類報(bào)告和混淆矩陣可以幫助我們?cè)u(píng)估模型的性能。2機(jī)器學(xué)習(xí):K-近鄰算法(KNN)2.1原理2.1.1距離度量方法K-近鄰算法的核心在于計(jì)算樣本之間的距離。在多維空間中,常用的幾種距離度量方法包括:2.1.1.1歐氏距離歐氏距離是最直觀的距離度量方法,它計(jì)算兩個(gè)點(diǎn)在多維空間中的直線距離。對(duì)于兩個(gè)點(diǎn)Ax1,d在多維空間中,公式可以擴(kuò)展為:d代碼示例:importnumpyasnp
defeuclidean_distance(a,b):
"""
計(jì)算兩個(gè)向量之間的歐氏距離
:parama:向量a
:paramb:向量b
:return:歐氏距離
"""
returnnp.sqrt(np.sum((a-b)**2))
#示例數(shù)據(jù)
a=np.array([1,2,3])
b=np.array([4,5,6])
#計(jì)算距離
distance=euclidean_distance(a,b)
print("歐氏距離:",distance)2.1.1.2曼哈頓距離曼哈頓距離,也稱為城市街區(qū)距離,計(jì)算兩個(gè)點(diǎn)在多維空間中沿坐標(biāo)軸方向的總距離。公式為:d代碼示例:defmanhattan_distance(a,b):
"""
計(jì)算兩個(gè)向量之間的曼哈頓距離
:parama:向量a
:paramb:向量b
:return:曼哈頓距離
"""
returnnp.sum(np.abs(a-b))
#示例數(shù)據(jù)
a=np.array([1,2,3])
b=np.array([4,5,6])
#計(jì)算距離
distance=manhattan_distance(a,b)
print("曼哈頓距離:",distance)2.1.1.3閔可夫斯基距離閔可夫斯基距離是歐氏距離和曼哈頓距離的泛化,通過調(diào)整參數(shù)p可以得到不同的距離度量。當(dāng)p=1時(shí),它是曼哈頓距離;當(dāng)d代碼示例:defminkowski_distance(a,b,p=3):
"""
計(jì)算兩個(gè)向量之間的閔可夫斯基距離
:parama:向量a
:paramb:向量b
:paramp:閔可夫斯基距離的參數(shù)p
:return:閔可夫斯基距離
"""
returnnp.power(np.sum(np.power(np.abs(a-b),p)),1/p)
#示例數(shù)據(jù)
a=np.array([1,2,3])
b=np.array([4,5,6])
#計(jì)算距離
distance=minkowski_distance(a,b,p=3)
print("閔可夫斯基距離:",distance)2.1.2K值的選擇K值的選擇對(duì)KNN算法的性能有重要影響。較小的K值會(huì)使模型對(duì)噪聲點(diǎn)敏感,容易過擬合;較大的K值則會(huì)使模型更加平滑,但可能引入更多的錯(cuò)誤分類。2.1.2.1交叉驗(yàn)證法交叉驗(yàn)證是一種評(píng)估模型性能和選擇K值的有效方法。通過將數(shù)據(jù)集分為訓(xùn)練集和驗(yàn)證集,可以評(píng)估不同K值下的模型性能,選擇使驗(yàn)證集誤差最小的K值。代碼示例:fromsklearn.model_selectionimportcross_val_score
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.datasetsimportload_iris
#加載數(shù)據(jù)
iris=load_iris()
X=iris.data
y=iris.target
#選擇K值
best_k=1
best_score=0
forkinrange(1,31):
knn=KNeighborsClassifier(n_neighbors=k)
scores=cross_val_score(knn,X,y,cv=5)
avg_score=np.mean(scores)
ifavg_score>best_score:
best_k=k
best_score=avg_score
print("最佳K值:",best_k)
print("平均交叉驗(yàn)證得分:",best_score)2.1.3分類與回歸的實(shí)現(xiàn)KNN可以用于分類和回歸任務(wù)。在分類任務(wù)中,KNN通過計(jì)算測(cè)試點(diǎn)與訓(xùn)練集中所有點(diǎn)的距離,找到距離最近的K個(gè)點(diǎn),然后根據(jù)這K個(gè)點(diǎn)的類別進(jìn)行投票,類別票數(shù)最多的即為測(cè)試點(diǎn)的預(yù)測(cè)類別。在回歸任務(wù)中,KNN則通過計(jì)算距離最近的K個(gè)點(diǎn)的平均值或加權(quán)平均值作為預(yù)測(cè)值。2.1.3.1分類任務(wù)使用KNN進(jìn)行分類任務(wù)的示例代碼如下:代碼示例:fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.datasetsimportload_iris
#加載數(shù)據(jù)
iris=load_iris()
X=iris.data
y=iris.target
#劃分?jǐn)?shù)據(jù)集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
#創(chuàng)建KNN分類器
knn=KNeighborsClassifier(n_neighbors=5)
#訓(xùn)練模型
knn.fit(X_train,y_train)
#預(yù)測(cè)
y_pred=knn.predict(X_test)
#輸出預(yù)測(cè)結(jié)果
print("預(yù)測(cè)結(jié)果:",y_pred)2.1.3.2回歸任務(wù)使用KNN進(jìn)行回歸任務(wù)的示例代碼如下:代碼示例:fromsklearn.neighborsimportKNeighborsRegressor
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.datasetsimportmake_regression
#生成回歸數(shù)據(jù)
X,y=make_regression(n_samples=100,n_features=1,noise=0.1)
#劃分?jǐn)?shù)據(jù)集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
#創(chuàng)建KNN回歸器
knn=KNeighborsRegressor(n_neighbors=5)
#訓(xùn)練模型
knn.fit(X_train,y_train)
#預(yù)測(cè)
y_pred=knn.predict(X_test)
#輸出預(yù)測(cè)結(jié)果
print("預(yù)測(cè)結(jié)果:",y_pred)2.2總結(jié)K-近鄰算法通過計(jì)算距離度量來確定測(cè)試樣本的類別或數(shù)值,其性能和結(jié)果受K值選擇的影響。通過選擇合適的距離度量方法和K值,KNN可以有效地應(yīng)用于分類和回歸任務(wù)中。3機(jī)器學(xué)習(xí):K-近鄰算法(KNN)實(shí)現(xiàn)步驟3.1數(shù)據(jù)預(yù)處理在應(yīng)用KNN算法之前,數(shù)據(jù)預(yù)處理是一個(gè)關(guān)鍵步驟。數(shù)據(jù)預(yù)處理包括清洗數(shù)據(jù)、處理缺失值、標(biāo)準(zhǔn)化或歸一化數(shù)據(jù)等,以確保模型的準(zhǔn)確性和可靠性。3.1.1示例:數(shù)據(jù)標(biāo)準(zhǔn)化假設(shè)我們有以下數(shù)據(jù)集:特征1特征2類別1.01.0A1.21.4A1.41.4B1.41.7B數(shù)據(jù)標(biāo)準(zhǔn)化的目的是將特征縮放到相同的尺度,避免某些特征因數(shù)值范圍大而對(duì)距離計(jì)算產(chǎn)生過大的影響。importnumpyasnp
fromsklearn.preprocessingimportStandardScaler
#原始數(shù)據(jù)
data=np.array([[1.0,1.0],
[1.2,1.4],
[1.4,1.4],
[1.4,1.7]])
#標(biāo)準(zhǔn)化數(shù)據(jù)
scaler=StandardScaler()
data_scaled=scaler.fit_transform(data)
print("原始數(shù)據(jù):\n",data)
print("標(biāo)準(zhǔn)化后的數(shù)據(jù):\n",data_scaled)3.2選擇K值K值的選擇直接影響KNN算法的性能。較小的K值會(huì)使模型對(duì)噪聲敏感,較大的K值則可能忽略類別間的界限。3.2.1示例:使用交叉驗(yàn)證選擇K值fromsklearn.model_selectionimportcross_val_score
fromsklearn.neighborsimportKNeighborsClassifier
#假設(shè)data_scaled是標(biāo)準(zhǔn)化后的數(shù)據(jù),labels是數(shù)據(jù)的類別標(biāo)簽
labels=np.array(['A','A','B','B'])
#使用交叉驗(yàn)證選擇最佳K值
k_values=range(1,11)
k_scores=[]
forkink_values:
knn=KNeighborsClassifier(n_neighbors=k)
scores=cross_val_score(knn,data_scaled,labels,cv=5)
k_scores.append(scores.mean())
#找到最佳K值
best_k=k_values[k_scores.index(max(k_scores))]
print("最佳K值:",best_k)3.3計(jì)算距離KNN算法通過計(jì)算樣本之間的距離來確定最近鄰。常用的距離度量有歐氏距離、曼哈頓距離等。3.3.1示例:計(jì)算歐氏距離fromscipy.spatialimportdistance
#計(jì)算兩個(gè)樣本之間的歐氏距離
sample1=data_scaled[0]
sample2=data_scaled[1]
euclidean_distance=distance.euclidean(sample1,sample2)
print("歐氏距離:",euclidean_distance)3.4確定最近鄰根據(jù)計(jì)算出的距離,選擇距離最近的K個(gè)樣本作為最近鄰。3.4.1示例:確定最近鄰fromsklearn.neighborsimportNearestNeighbors
#創(chuàng)建KNN模型,確定最近的3個(gè)鄰居
knn_model=NearestNeighbors(n_neighbors=3,algorithm='ball_tree').fit(data_scaled)
distances,indices=knn_model.kneighbors([data_scaled[0]])
print("最近鄰的索引:",indices)
print("最近鄰的距離:",distances)3.5預(yù)測(cè)分類或回歸根據(jù)最近鄰的類別或數(shù)值,通過多數(shù)表決或平均值來預(yù)測(cè)新樣本的類別或數(shù)值。3.5.1示例:KNN分類fromcollectionsimportCounter
#假設(shè)我們有一個(gè)新樣本
new_sample=np.array([[1.1,1.1]])
#使用之前確定的K值和數(shù)據(jù)集訓(xùn)練模型
knn_classifier=KNeighborsClassifier(n_neighbors=best_k)
knn_classifier.fit(data_scaled,labels)
#預(yù)測(cè)新樣本的類別
predicted_label=knn_classifier.predict(new_sample)
#手動(dòng)計(jì)算多數(shù)表決
_,indices=knn_model.kneighbors(new_sample)
nearest_labels=[labels[i]foriinindices[0]]
majority_label=Counter(nearest_labels).most_common(1)[0][0]
print("預(yù)測(cè)的類別:",predicted_label)
print("手動(dòng)計(jì)算的多數(shù)表決類別:",majority_label)3.5.2示例:KNN回歸對(duì)于回歸問題,KNN算法預(yù)測(cè)的是數(shù)值,通常采用最近鄰的平均值作為預(yù)測(cè)值。fromsklearn.neighborsimportKNeighborsRegressor
#假設(shè)我們有以下數(shù)值數(shù)據(jù)
numeric_data=np.array([[1.0,1.0,2.0],
[1.2,1.4,2.2],
[1.4,1.4,2.5],
[1.4,1.7,2.8]])
#假設(shè)我們有一個(gè)新樣本
new_numeric_sample=np.array([[1.1,1.1]])
#使用KNN回歸模型
knn_regressor=KNeighborsRegressor(n_neighbors=best_k)
knn_regressor.fit(numeric_data[:,:2],numeric_data[:,2])
#預(yù)測(cè)新樣本的數(shù)值
predicted_value=knn_regressor.predict(new_numeric_sample)
print("預(yù)測(cè)的數(shù)值:",predicted_value)通過以上步驟,我們可以有效地實(shí)現(xiàn)K-近鄰算法,無論是用于分類還是回歸問題。4應(yīng)用案例4.1手寫數(shù)字識(shí)別在手寫數(shù)字識(shí)別中,K-近鄰算法(KNN)是一種直觀且有效的分類方法。它通過比較輸入圖像與訓(xùn)練集中的圖像,找到最相似的圖像來識(shí)別數(shù)字。下面是一個(gè)使用Python和scikit-learn庫實(shí)現(xiàn)手寫數(shù)字識(shí)別的例子。假設(shè)我們有MNIST數(shù)據(jù)集,它包含手寫數(shù)字的圖像和對(duì)應(yīng)的標(biāo)簽。fromsklearn.datasetsimportfetch_openml
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.metricsimportclassification_report
#加載MNIST數(shù)據(jù)集
mnist=fetch_openml('mnist_784',version=1)
X,y=mnist['data'],mnist['target']
#將數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
#創(chuàng)建KNN分類器
knn=KNeighborsClassifier(n_neighbors=3)
#訓(xùn)練模型
knn.fit(X_train,y_train)
#預(yù)測(cè)測(cè)試集
y_pred=knn.predict(X_test)
#輸出分類報(bào)告
print(classification_report(y_test,y_pred))在這個(gè)例子中,我們首先加載了MNIST數(shù)據(jù)集,然后將其分為訓(xùn)練集和測(cè)試集。接著,我們創(chuàng)建了一個(gè)KNN分類器,并使用訓(xùn)練集對(duì)其進(jìn)行訓(xùn)練。最后,我們使用測(cè)試集評(píng)估模型的性能。4.2文本分類KNN算法也可以應(yīng)用于文本分類,例如情感分析或主題分類。文本數(shù)據(jù)通常需要進(jìn)行預(yù)處理,包括分詞、去除停用詞、詞干提取和向量化。下面是一個(gè)使用Python和scikit-learn庫進(jìn)行文本分類的例子。假設(shè)我們有一組電影評(píng)論數(shù)據(jù),其中包含正面和負(fù)面評(píng)論。fromsklearn.feature_extraction.textimportCountVectorizer
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.metricsimportclassification_report
#示例評(píng)論數(shù)據(jù)
comments=[
"這部電影太棒了,我非常喜歡它。",
"我不喜歡這部電影,太無聊了。",
"演員表現(xiàn)得非常好,劇情也很吸引人。",
"這部電影太糟糕了,不值得一看。",
"導(dǎo)演的創(chuàng)意令人印象深刻,期待他的下一部作品。"
]
labels=['positive','negative','positive','negative','positive']
#將文本數(shù)據(jù)向量化
vectorizer=CountVectorizer()
X=vectorizer.fit_transform(comments)
#將數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X,labels,test_size=0.2,random_state=42)
#創(chuàng)建KNN分類器
knn=KNeighborsClassifier(n_neighbors=3)
#訓(xùn)練模型
knn.fit(X_train,y_train)
#預(yù)測(cè)測(cè)試集
y_pred=knn.predict(X_test)
#輸出分類報(bào)告
print(classification_report(y_test,y_pred))在這個(gè)例子中,我們首先將文本數(shù)據(jù)向量化,然后將其分為訓(xùn)練集和測(cè)試集。接著,我們創(chuàng)建了一個(gè)KNN分類器,并使用訓(xùn)練集對(duì)其進(jìn)行訓(xùn)練。最后,我們使用測(cè)試集評(píng)估模型的性能。4.3推薦系統(tǒng)KNN算法在推薦系統(tǒng)中用于基于用戶或物品的相似度進(jìn)行推薦。下面是一個(gè)使用Python和scikit-learn庫實(shí)現(xiàn)基于用戶相似度的推薦系統(tǒng)例子。假設(shè)我們有一個(gè)用戶對(duì)電影的評(píng)分?jǐn)?shù)據(jù)。importnumpyasnp
fromsklearn.neighborsimportNearestNeighbors
#示例評(píng)分?jǐn)?shù)據(jù)
ratings=np.array([
[5,3,0,1],
[4,0,0,1],
[1,1,0,5],
[1,0,0,4],
[0,1,5,4],
])
#創(chuàng)建KNN模型
knn=NearestNeighbors(n_neighbors=2)
knn.fit(ratings)
#找到與用戶1最相似的用戶
similar_users=knn.kneighbors([ratings[0]],return_distance=False)
print("與用戶1最相似的用戶:",similar_users)
#基于相似用戶進(jìn)行推薦
user_to_recommend=0
recommended_movies=[]
forsimilar_userinsimilar_users[0]:
ifsimilar_user!=user_to_recommend:
formovie,ratinginenumerate(ratings[similar_user]):
ifrating>0andratings[user_to_recommend][movie]==0:
recommended_movies.append((movie,rating))
print("推薦給用戶1的電影:",recommended_movies)在這個(gè)例子中,我們首先創(chuàng)建了一個(gè)KNN模型,并使用評(píng)分?jǐn)?shù)據(jù)對(duì)其進(jìn)行訓(xùn)練。然后,我們找到了與用戶1最相似的用戶,并基于這些相似用戶進(jìn)行電影推薦。注意,這個(gè)例子中的推薦是基于用戶評(píng)分的相似度,而不是基于物品的相似度。以上三個(gè)例子展示了K-近鄰算法在不同領(lǐng)域的應(yīng)用,包括手寫數(shù)字識(shí)別、文本分類和推薦系統(tǒng)。通過調(diào)整參數(shù)和預(yù)處理步驟,KNN可以適應(yīng)各種分類和回歸任務(wù)。4.4優(yōu)缺點(diǎn)與改進(jìn)4.4.1KNN算法的優(yōu)點(diǎn)K-近鄰算法(KNN)是一種基于實(shí)例的學(xué)習(xí)方法,它在預(yù)測(cè)時(shí)不需要進(jìn)行訓(xùn)練,而是直接使用數(shù)據(jù)集中的實(shí)例進(jìn)行預(yù)測(cè)。KNN算法的主要優(yōu)點(diǎn)包括:簡(jiǎn)單直觀:KNN算法的原理非常直觀,易于理解和實(shí)現(xiàn)。無需訓(xùn)練:與許多其他機(jī)器學(xué)習(xí)算法不同,KNN在預(yù)測(cè)階段才使用數(shù)據(jù),這意味著它不需要一個(gè)訓(xùn)練階段,可以立即開始預(yù)測(cè)。多分類支持:KNN可以很容易地?cái)U(kuò)展到多分類問題,而不僅僅是二分類。非參數(shù)方法:KNN是一種非參數(shù)學(xué)習(xí)方法,這意味著它不需要假設(shè)數(shù)據(jù)的分布,可以適應(yīng)各種數(shù)據(jù)類型。高精度:在許多情況下,KNN可以達(dá)到較高的預(yù)測(cè)精度,尤其是在數(shù)據(jù)集足夠大且特征空間分布均勻時(shí)。4.4.2KNN算法的缺點(diǎn)盡管KNN算法有其優(yōu)點(diǎn),但也存在一些顯著的缺點(diǎn):計(jì)算成本高:KNN在預(yù)測(cè)時(shí)需要計(jì)算測(cè)試樣本與所有訓(xùn)練樣本之間的距離,當(dāng)數(shù)據(jù)集非常大時(shí),這會(huì)導(dǎo)致計(jì)算成本非常高。存儲(chǔ)成本高:由于KNN是基于實(shí)例的學(xué)習(xí)方法,它需要存儲(chǔ)整個(gè)訓(xùn)練數(shù)據(jù)集,這在數(shù)據(jù)量大時(shí)會(huì)占用大量存儲(chǔ)空間。對(duì)K值敏感:K值的選擇對(duì)KNN的性能有顯著影響。如果K值選擇不當(dāng),可能會(huì)導(dǎo)致過擬合或欠擬合。受噪聲影響:KNN對(duì)數(shù)據(jù)中的噪聲非常敏感,噪聲點(diǎn)可能會(huì)誤導(dǎo)算法,導(dǎo)致預(yù)測(cè)錯(cuò)誤。不平衡數(shù)據(jù)集問題:在類別不平衡的數(shù)據(jù)集中,KNN可能會(huì)偏向于數(shù)量較多的類別,導(dǎo)致預(yù)測(cè)不準(zhǔn)確。4.4.3KNN算法的改進(jìn)方法為了克服KNN算法的缺點(diǎn),研究者們提出了多種改進(jìn)方法:加權(quán)KNN:在計(jì)算距離時(shí),給不同的訓(xùn)練樣本分配不同的權(quán)重,通常距離更近的樣本權(quán)重更高,這樣可以減少噪聲點(diǎn)的影響。#加權(quán)KNN示例代碼
fromsklearn.neighborsimportKNeighborsClassifier
importnumpyasnp
#創(chuàng)建數(shù)據(jù)集
X=np.array([[1,2],[2,3],[3,1],[6,5],[7,7],[2,6]])
y=np.array([1,1,1,2,2,2])
#創(chuàng)建加權(quán)KNN分類器
knn=KNeighborsClassifier(n_neighbors=3,weights='distance')
#訓(xùn)練模型
knn.fit(X,y)
#預(yù)測(cè)新數(shù)據(jù)點(diǎn)
prediction=knn.predict([[4,4]])
print(prediction)K值優(yōu)化:通過交叉驗(yàn)證等方法來選擇最優(yōu)的K值,以平衡過擬合和欠擬合的風(fēng)險(xiǎn)。#K值優(yōu)化示例代碼
fromsklearn.model_selectionimportGridSearchCV
#定義參數(shù)網(wǎng)格
param_grid={'n_neighbors':np.arange(1,50)}
#創(chuàng)建KNN分類器
knn=KNeighborsClassifier()
#使用GridSearchCV進(jìn)行K值優(yōu)化
knn_cv=GridSearchCV(knn,param_grid,cv=5)
knn_cv.fit(X,y)
#輸出最優(yōu)K值
print(knn_cv.best_params_)特征選擇與降維:通過特征選擇或降維技術(shù),如主成分分析(PCA),可以減少計(jì)算成本和存儲(chǔ)成本,同時(shí)提高預(yù)測(cè)精度。#PCA降維示例代碼
fromsklearn.decompositionimportPCA
#創(chuàng)建PCA對(duì)象
pca=PCA(n_components=2)
#對(duì)數(shù)據(jù)進(jìn)行降維
X_pca=pca.fit_transform(X)
#使用降維后的數(shù)據(jù)進(jìn)行KNN預(yù)測(cè)
knn.fit(X_pca,y)
prediction=knn.predict([[4,4]])
print(prediction)處理不平衡數(shù)據(jù)集:可以使用過采樣(如SMOTE)或欠采樣技術(shù)來平衡數(shù)據(jù)集,從而提高KNN在不平衡數(shù)據(jù)集上的性能。#SMOTE過采樣示例代碼
fromimblearn.over_samplingimportSMOTE
#創(chuàng)建SMOTE對(duì)象
smote=SMOTE()
#對(duì)數(shù)據(jù)進(jìn)行過采樣
X_resampled,y_resampled=smote.fit_resample(X,y)
#使用過采樣后的數(shù)據(jù)進(jìn)行KNN預(yù)測(cè)
knn.fit(X_resampled,y_resampled)
prediction=knn.predict([[4,4]])
print(prediction)通過這些改進(jìn)方法,KNN算法可以在保持其優(yōu)點(diǎn)的同時(shí),有效克服其缺點(diǎn),提高在實(shí)際應(yīng)用中的性能和效率。4.5實(shí)踐與代碼實(shí)現(xiàn)4.5.1使用Python實(shí)現(xiàn)KNNK-近鄰算法(KNN)是一種基于實(shí)例的學(xué)習(xí)方法,用于分類和回歸。在分類問題中,KNN通過計(jì)算待分類樣本與訓(xùn)練集中所有樣本的距離,然后選取距離最近的K個(gè)樣本,根據(jù)這K個(gè)樣本的類別來預(yù)測(cè)待分類樣本的類別。距離的計(jì)算通常采用歐氏距離。4.5.1.1示例代碼importnumpyasnp
fromcollectionsimportCounter
fromsklearn.model_selectionimporttrain_test_split
fromsklearnimportdatasets
#加載數(shù)據(jù)集
defload_data():
iris=datasets.load_iris()
X=iris.data
y=iris.target
returnX,y
#歐氏距離計(jì)算
defeuclidean_distance(x1,x2):
returnnp.sqrt(np.sum((x1-x2)**2))
#KNN分類器
classKNN:
def__init__(self,k=3):
self.k=k
deffit(self,X,y):
self.X_train=X
self.y_train=y
defpredict(self,X):
y_pred=[self._predict(x)forxinX]
returnnp.array(y_pred)
def_predict(self,x):
#計(jì)算距離
distances=[euclidean_distance(x,x_train)forx_traininself.X_train]
#獲取最近的K個(gè)樣本的索引
k_indices=np.argsort(distances)[:self.k]
#獲取最近的K個(gè)樣本的標(biāo)簽
k_nearest_labels=[self.y_train[i]foriink_indices]
#投票決定分類
most_common=Counter(k_nearest_labels).most_common(1)
returnmost_common[0][0]
#加載數(shù)據(jù)
X,y=load_data()
#劃分?jǐn)?shù)據(jù)集
X_train,X_test,y_train,y_test=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024房屋建筑合同范本
- 2024年新型熱塑彈性體防水卷材成型設(shè)備項(xiàng)目發(fā)展計(jì)劃
- 2024商標(biāo)注冊(cè)申請(qǐng)代理合同范本
- 2024簡(jiǎn)單電腦租賃合同范本
- 2024廠房及設(shè)備租賃合同范本
- 蘇教版初中生物復(fù)習(xí)寶典
- 2024年美國(guó)汽車電商市場(chǎng)數(shù)據(jù)及預(yù)測(cè)報(bào)告-2024-09-數(shù)字化
- 2024人員的聘用合同范本
- 2024年GSM和CDMA制移動(dòng)通信檢測(cè)設(shè)備項(xiàng)目發(fā)展計(jì)劃
- 2024年非金屬材料結(jié)構(gòu)件項(xiàng)目發(fā)展計(jì)劃
- 污水管網(wǎng)巡查及養(yǎng)護(hù) 投標(biāo)方案(技術(shù)方案)
- 2024年新疆交投資源開發(fā)有限責(zé)任公司招聘筆試參考題庫附帶答案詳解
- 小學(xué)初任教師專業(yè)發(fā)展現(xiàn)狀、問題及策略研究的開題報(bào)告
- 天津市靜海模范中學(xué)2023-2024學(xué)年九年級(jí)上學(xué)期月考數(shù)學(xué)試題
- GB/T 37364.3-2024陸生野生動(dòng)物及其棲息地調(diào)查技術(shù)規(guī)程第3部分:獸類
- 2024十八項(xiàng)醫(yī)療核心制度必考試題庫及答案
- 2024年古井貢酒營(yíng)銷委培生招聘筆試參考題庫附帶答案詳解
- 《機(jī)械電子工程導(dǎo)論》課件
- 財(cái)務(wù)知識(shí)安全管理培訓(xùn)課件
- 1《獨(dú)一無二的我》課件心理健康四年級(jí)大象版
- 型開式固定臺(tái)壓力機(jī)說明書樣本
評(píng)論
0/150
提交評(píng)論