機(jī)器學(xué)習(xí):K-近鄰算法(KNN):K-近鄰算法原理與應(yīng)用_第1頁
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):K-近鄰算法原理與應(yīng)用_第2頁
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):K-近鄰算法原理與應(yīng)用_第3頁
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):K-近鄰算法原理與應(yīng)用_第4頁
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):K-近鄰算法原理與應(yīng)用_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論