版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):分類與回歸任務(wù)中的應(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)練過(guò)程,而是將數(shù)據(jù)集中的每個(gè)樣本作為學(xué)習(xí)的實(shí)例。當(dāng)有新的輸入數(shù)據(jù)時(shí),KNN算法會(huì)根據(jù)輸入數(shù)據(jù)在特征空間中的位置,找到距離它最近的K個(gè)訓(xùn)練樣本,然后根據(jù)這K個(gè)樣本的類別來(lái)預(yù)測(cè)新數(shù)據(jù)的類別。對(duì)于分類任務(wù),新數(shù)據(jù)的類別通常由這K個(gè)樣本中出現(xiàn)最多的類別決定;對(duì)于回歸任務(wù),則通常采用這K個(gè)樣本的平均值或加權(quán)平均值作為預(yù)測(cè)值。1.1.2KNN算法的工作原理KNN算法的核心在于計(jì)算距離和選擇最近的鄰居。距離計(jì)算可以采用多種方式,如歐氏距離、曼哈頓距離、切比雪夫距離等。一旦確定了距離度量,算法將遍歷整個(gè)訓(xùn)練數(shù)據(jù)集,計(jì)算新數(shù)據(jù)與每個(gè)訓(xùn)練樣本之間的距離,然后選擇距離最近的K個(gè)樣本。對(duì)于分類任務(wù),這K個(gè)樣本中出現(xiàn)最多的類別即為預(yù)測(cè)類別;對(duì)于回歸任務(wù),這K個(gè)樣本的平均值或加權(quán)平均值即為預(yù)測(cè)值。1.1.2.1示例:使用Python實(shí)現(xiàn)KNN分類假設(shè)我們有以下數(shù)據(jù)集,其中包含兩個(gè)特征X1和X2,以及對(duì)應(yīng)的類別Y:X1X2Y120210130331341431我們將使用這個(gè)數(shù)據(jù)集來(lái)預(yù)測(cè)新數(shù)據(jù)點(diǎn)(2,2)的類別。importnumpyasnp
fromcollectionsimportCounter
fromscipy.spatialimportdistance
#訓(xùn)練數(shù)據(jù)集
dataset={
'0':[[1,2],[2,1],[1,3]],
'1':[[3,3],[3,4],[4,3]]
}
#新數(shù)據(jù)點(diǎn)
new_point=[2,2]
#K值
k=3
#計(jì)算距離
defcalculate_distance(data_point):
distances=[]
forcategory,pointsindataset.items():
forpointinpoints:
dist=distance.euclidean(point,new_point)
distances.append([dist,category])
distances.sort()
returndistances
#預(yù)測(cè)類別
defpredict_category(distances,k):
categories=[dist[1]fordistindistances[:k]]
prediction=Counter(categories).most_common(1)[0][0]
returnprediction
#執(zhí)行KNN算法
distances=calculate_distance(new_point)
prediction=predict_category(distances,k)
print(f'預(yù)測(cè)類別為:{prediction}')在這個(gè)例子中,我們首先定義了訓(xùn)練數(shù)據(jù)集dataset,其中0和1分別代表兩個(gè)類別。然后,我們定義了新數(shù)據(jù)點(diǎn)new_point和K值k。calculate_distance函數(shù)用于計(jì)算新數(shù)據(jù)點(diǎn)與訓(xùn)練數(shù)據(jù)集中每個(gè)點(diǎn)的距離,并將結(jié)果按距離排序。predict_category函數(shù)則從排序后的距離列表中選擇最近的K個(gè)點(diǎn),使用collections.Counter來(lái)統(tǒng)計(jì)類別出現(xiàn)的次數(shù),最后返回出現(xiàn)次數(shù)最多的類別作為預(yù)測(cè)結(jié)果。1.1.2.2示例:使用Python實(shí)現(xiàn)KNN回歸假設(shè)我們有以下數(shù)據(jù)集,其中包含兩個(gè)特征X1和X2,以及對(duì)應(yīng)的數(shù)值型目標(biāo)變量Y:X1X2Y121021151312332034224325我們將使用這個(gè)數(shù)據(jù)集來(lái)預(yù)測(cè)新數(shù)據(jù)點(diǎn)(2,2)的目標(biāo)變量值。importnumpyasnp
fromscipy.spatialimportdistance
#訓(xùn)練數(shù)據(jù)集
dataset=np.array([
[1,2,10],
[2,1,15],
[1,3,12],
[3,3,20],
[3,4,22],
[4,3,25]
])
#新數(shù)據(jù)點(diǎn)
new_point=np.array([2,2])
#K值
k=3
#計(jì)算距離并預(yù)測(cè)
defknn_regression(data,query,k):
distances=[]
foriinrange(len(data)):
dist=distance.euclidean(data[i][:-1],query)
distances.append([dist,data[i][-1]])
distances.sort()
neighbors=distances[:k]
prediction=np.mean([n[1]forninneighbors])
returnprediction
#執(zhí)行KNN回歸
prediction=knn_regression(dataset,new_point,k)
print(f'預(yù)測(cè)值為:{prediction}')在這個(gè)回歸示例中,我們使用了scipy.spatial.distance.euclidean來(lái)計(jì)算歐氏距離。knn_regression函數(shù)首先計(jì)算新數(shù)據(jù)點(diǎn)與數(shù)據(jù)集中每個(gè)點(diǎn)的距離,然后選擇距離最近的K個(gè)點(diǎn),最后計(jì)算這K個(gè)點(diǎn)的目標(biāo)變量值的平均值作為預(yù)測(cè)結(jié)果。2KNN在分類任務(wù)中的應(yīng)用2.1選擇合適的K值在K-近鄰算法中,K值的選擇至關(guān)重要。K值決定了在預(yù)測(cè)時(shí)考慮多少個(gè)最近的鄰居。選擇較小的K值(如K=1或K=2)會(huì)使決策邊界變得復(fù)雜,容易過(guò)擬合;而選擇較大的K值會(huì)使決策邊界變得平滑,可能引入更多的噪聲,導(dǎo)致欠擬合。2.1.1示例:使用交叉驗(yàn)證選擇K值fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimportcross_val_score
fromsklearn.neighborsimportKNeighborsClassifier
importnumpyasnp
#加載數(shù)據(jù)集
iris=load_iris()
X,y=iris.data,iris.target
#定義K值范圍
k_range=range(1,31)
#使用交叉驗(yàn)證計(jì)算不同K值下的準(zhǔn)確率
k_scores=[]
forkink_range:
knn=KNeighborsClassifier(n_neighbors=k)
scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy')
k_scores.append(scores.mean())
#找到最佳K值
best_k=k_range[np.argmax(k_scores)]
print(f"BestKvalue:{best_k}")2.2距離度量方法KNN算法依賴于距離度量來(lái)確定“近鄰”。常見(jiàn)的距離度量方法包括歐氏距離、曼哈頓距離和閔可夫斯基距離。2.2.1歐氏距離歐氏距離是最直觀的距離度量方法,它計(jì)算兩個(gè)點(diǎn)在多維空間中的直線距離。2.2.2曼哈頓距離曼哈頓距離,也稱為城市街區(qū)距離,計(jì)算兩個(gè)點(diǎn)在多維空間中沿坐標(biāo)軸方向的總距離。2.2.3閔可夫斯基距離閔可夫斯基距離是歐氏距離和曼哈頓距離的泛化,通過(guò)調(diào)整參數(shù)p可以得到不同的距離度量。2.2.4示例:計(jì)算不同距離度量importnumpyasnp
fromscipy.spatialimportdistance
#定義兩個(gè)點(diǎn)
point1=np.array([1,2])
point2=np.array([4,6])
#計(jì)算歐氏距離
euclidean=distance.euclidean(point1,point2)
print(f"Euclideandistance:{euclidean}")
#計(jì)算曼哈頓距離
manhattan=distance.cityblock(point1,point2)
print(f"Manhattandistance:{manhattan}")
#計(jì)算閔可夫斯基距離(p=3)
minkowski=distance.minkowski(point1,point2,p=3)
print(f"Minkowskidistance(p=3):{minkowski}")2.3分類決策規(guī)則KNN算法在分類任務(wù)中使用多數(shù)表決原則。即,預(yù)測(cè)點(diǎn)的類別由其最近的K個(gè)鄰居的類別決定。最常見(jiàn)的決策規(guī)則是多數(shù)類別表決,但也可以使用加權(quán)表決,其中距離更近的點(diǎn)具有更大的權(quán)重。2.3.1示例:多數(shù)表決與加權(quán)表決fromsklearn.datasetsimportmake_classification
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.neighborsimportKNeighborsClassifier
#生成分類數(shù)據(jù)
X,y=make_classification(n_samples=100,n_features=2,n_informative=2,n_redundant=0,n_classes=2,random_state=1)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
#多數(shù)表決
knn_majority=KNeighborsClassifier(n_neighbors=5,weights='uniform')
knn_majority.fit(X_train,y_train)
y_pred_majority=knn_majority.predict(X_test)
#加權(quán)表決
knn_weighted=KNeighborsClassifier(n_neighbors=5,weights='distance')
knn_weighted.fit(X_train,y_train)
y_pred_weighted=knn_weighted.predict(X_test)
#打印預(yù)測(cè)結(jié)果
print("Majorityvotingpredictions:",y_pred_majority)
print("Weightedvotingpredictions:",y_pred_weighted)2.4KNN分類算法的實(shí)現(xiàn)KNN算法的實(shí)現(xiàn)通常包括以下步驟:數(shù)據(jù)預(yù)處理、計(jì)算距離、選擇最近的鄰居、進(jìn)行分類決策。2.4.1示例:從零開(kāi)始實(shí)現(xiàn)KNN分類器importnumpyasnp
fromcollectionsimportCounter
classKNNClassifier:
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=[distance.euclidean(x,x_train)forx_traininself.X_train]
#獲取最近的K個(gè)鄰居
k_indices=np.argsort(distances)[:self.k]
k_nearest_labels=[self.y_train[i]foriink_indices]
#多數(shù)表決
most_common=Counter(k_nearest_labels).most_common(1)
returnmost_common[0][0]
#生成數(shù)據(jù)
X,y=make_classification(n_samples=100,n_features=2,n_informative=2,n_redundant=0,n_classes=2,random_state=1)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
#實(shí)例化KNN分類器
knn=KNNClassifier(k=5)
knn.fit(X_train,y_train)
y_pred=knn.predict(X_test)
#打印預(yù)測(cè)結(jié)果
print("Predictions:",y_pred)在上述代碼中,我們定義了一個(gè)簡(jiǎn)單的KNN分類器類,它使用歐氏距離進(jìn)行計(jì)算,并通過(guò)多數(shù)表決進(jìn)行分類決策。通過(guò)調(diào)整k值,我們可以控制決策的復(fù)雜度。在實(shí)際應(yīng)用中,選擇合適的K值、距離度量方法和決策規(guī)則對(duì)于提高KNN分類器的性能至關(guān)重要。3KNN在回歸任務(wù)中的應(yīng)用3.1KNN回歸的基本思想K-近鄰算法(KNN)在回歸任務(wù)中的應(yīng)用與分類任務(wù)有所不同,但其核心思想仍然基于相似性度量。在回歸任務(wù)中,KNN算法的目標(biāo)是預(yù)測(cè)一個(gè)連續(xù)值的輸出,而不是類別?;舅枷肴缦拢河?jì)算距離:對(duì)于一個(gè)新的輸入樣本,計(jì)算它與訓(xùn)練集中的每個(gè)樣本之間的距離。找到K個(gè)最近鄰:從訓(xùn)練集中選擇距離最近的K個(gè)樣本。預(yù)測(cè)輸出:預(yù)測(cè)值通常是這K個(gè)最近鄰樣本的輸出值的加權(quán)平均或簡(jiǎn)單平均。3.1.1示例描述假設(shè)我們有一組數(shù)據(jù),其中包含房屋的特征(如面積、臥室數(shù)量)和價(jià)格。我們的目標(biāo)是預(yù)測(cè)一個(gè)新房屋的價(jià)格。我們將使用KNN回歸算法來(lái)實(shí)現(xiàn)這一目標(biāo)。3.1.2數(shù)據(jù)樣例房屋面積(平方米)臥室數(shù)量?jī)r(jià)格(萬(wàn)元)1002501503801202601804120901403.2權(quán)重計(jì)算方法在KNN回歸中,權(quán)重計(jì)算方法對(duì)于預(yù)測(cè)的準(zhǔn)確性至關(guān)重要。常見(jiàn)的權(quán)重計(jì)算方法包括:統(tǒng)一權(quán)重:所有K個(gè)最近鄰的權(quán)重相同。距離權(quán)重:權(quán)重與距離成反比,通常使用距離的倒數(shù)或距離的平方的倒數(shù)作為權(quán)重。3.2.1示例代碼importnumpyasnp
fromsklearn.neighborsimportKNeighborsRegressor
#訓(xùn)練數(shù)據(jù)
X_train=np.array([[100,2],[150,3],[120,2],[180,4],[90,1]])
y_train=np.array([50,80,60,120,40])
#創(chuàng)建KNN回歸模型,使用距離權(quán)重
knn=KNeighborsRegressor(n_neighbors=3,weights='distance')
#訓(xùn)練模型
knn.fit(X_train,y_train)
#預(yù)測(cè)新房屋的價(jià)格
X_test=np.array([[130,3]])
prediction=knn.predict(X_test)
print("預(yù)測(cè)價(jià)格:",prediction)3.2.2代碼解釋上述代碼中,我們首先導(dǎo)入了必要的庫(kù),然后定義了訓(xùn)練數(shù)據(jù)X_train和對(duì)應(yīng)的標(biāo)簽y_train。接下來(lái),我們創(chuàng)建了一個(gè)KNeighborsRegressor模型,其中n_neighbors參數(shù)設(shè)置為3,表示我們考慮最近的3個(gè)鄰居,weights參數(shù)設(shè)置為distance,表示使用距離作為權(quán)重。模型訓(xùn)練后,我們使用測(cè)試數(shù)據(jù)X_test進(jìn)行預(yù)測(cè),并輸出預(yù)測(cè)結(jié)果。3.3KNN回歸算法的實(shí)現(xiàn)實(shí)現(xiàn)KNN回歸算法的關(guān)鍵步驟包括數(shù)據(jù)預(yù)處理、模型訓(xùn)練和預(yù)測(cè)。在實(shí)際應(yīng)用中,還需要考慮K值的選擇、距離度量方式以及權(quán)重計(jì)算方法。3.3.1示例代碼#自定義KNN回歸算法
classKNNRegressor:
def__init__(self,n_neighbors=5,weights='uniform'):
self.n_neighbors=n_neighbors
self.weights=weights
deffit(self,X,y):
self.X_train=X
self.y_train=y
defpredict(self,X):
predictions=[]
forxinX:
#計(jì)算距離
distances=np.sqrt(np.sum((self.X_train-x)**2,axis=1))
#找到K個(gè)最近鄰
k_indices=np.argsort(distances)[:self.n_neighbors]
k_nearest_labels=self.y_train[k_indices]
#計(jì)算權(quán)重
ifself.weights=='distance':
k_weights=1/distances[k_indices]
else:
k_weights=np.ones(self.n_neighbors)
#預(yù)測(cè)輸出
prediction=np.average(k_nearest_labels,weights=k_weights)
predictions.append(prediction)
returnnp.array(predictions)
#使用自定義KNN回歸模型
knn_regressor=KNNRegressor(n_neighbors=3,weights='distance')
knn_regressor.fit(X_train,y_train)
prediction=knn_regressor.predict(X_test)
print("預(yù)測(cè)價(jià)格:",prediction)3.3.2代碼解釋在這個(gè)自定義的KNN回歸模型中,我們定義了一個(gè)KNNRegressor類,它包含初始化、訓(xùn)練和預(yù)測(cè)方法。在fit方法中,我們簡(jiǎn)單地存儲(chǔ)了訓(xùn)練數(shù)據(jù)和標(biāo)簽。predict方法中,我們對(duì)每個(gè)測(cè)試樣本計(jì)算了與訓(xùn)練樣本的距離,找到了最近的K個(gè)鄰居,并根據(jù)選擇的權(quán)重計(jì)算方法(統(tǒng)一或距離)計(jì)算了預(yù)測(cè)值。最后,我們使用這個(gè)自定義模型進(jìn)行了預(yù)測(cè),并輸出了結(jié)果。通過(guò)以上示例,我們可以看到KNN回歸算法在預(yù)測(cè)連續(xù)值輸出時(shí)的靈活性和實(shí)用性。選擇合適的K值、距離度量和權(quán)重計(jì)算方法對(duì)于提高預(yù)測(cè)準(zhǔn)確性至關(guān)重要。4KNN算法的優(yōu)缺點(diǎn)4.1KNN算法的優(yōu)點(diǎn)K-近鄰算法(KNN)是一種基于實(shí)例的學(xué)習(xí)方法,它在分類和回歸任務(wù)中都有廣泛的應(yīng)用。KNN算法的優(yōu)點(diǎn)主要體現(xiàn)在以下幾個(gè)方面:簡(jiǎn)單直觀:KNN算法的原理非常直觀,容易理解和實(shí)現(xiàn)。它不需要訓(xùn)練模型,只需要在預(yù)測(cè)時(shí)計(jì)算測(cè)試樣本與訓(xùn)練樣本之間的距離,然后根據(jù)最近的K個(gè)鄰居的類別或數(shù)值進(jìn)行預(yù)測(cè)。無(wú)需訓(xùn)練過(guò)程:與許多其他機(jī)器學(xué)習(xí)算法不同,KNN在訓(xùn)練階段不需要進(jìn)行復(fù)雜的計(jì)算,只需要將訓(xùn)練數(shù)據(jù)存儲(chǔ)起來(lái)。這意味著KNN可以處理非常大的數(shù)據(jù)集,只要內(nèi)存足夠。可以處理多分類問(wèn)題:KNN算法不僅適用于二分類問(wèn)題,也適用于多分類問(wèn)題。在多分類問(wèn)題中,KNN算法可以計(jì)算測(cè)試樣本與每個(gè)類別中訓(xùn)練樣本的距離,然后根據(jù)最近的K個(gè)鄰居的類別進(jìn)行投票。對(duì)異常值不敏感:由于KNN算法是基于多數(shù)投票或平均值的,因此它對(duì)異常值的敏感度較低。如果K值選擇得當(dāng),異常值對(duì)預(yù)測(cè)結(jié)果的影響可以被最小化??梢蕴幚矸蔷€性問(wèn)題:KNN算法不需要假設(shè)數(shù)據(jù)的分布或線性關(guān)系,因此它可以處理非線性問(wèn)題。只要數(shù)據(jù)點(diǎn)之間的距離可以合理地度量,KNN就能找到最近的鄰居并進(jìn)行預(yù)測(cè)。4.1.1示例代碼:KNN分類假設(shè)我們有一個(gè)簡(jiǎn)單的二分類數(shù)據(jù)集,我們將使用Python的scikit-learn庫(kù)來(lái)實(shí)現(xiàn)KNN分類。fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.metricsimportaccuracy_score
#加載數(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分類器
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=accuracy_score(y_test,y_pred)
print(f"Accuracy:{accuracy}")在這個(gè)例子中,我們使用了Iris數(shù)據(jù)集,這是一個(gè)經(jīng)典的多分類數(shù)據(jù)集。我們首先加載數(shù)據(jù),然后將其劃分為訓(xùn)練集和測(cè)試集。接著,我們創(chuàng)建了一個(gè)KNN分類器,并使用訓(xùn)練數(shù)據(jù)對(duì)其進(jìn)行訓(xùn)練。最后,我們使用測(cè)試集進(jìn)行預(yù)測(cè),并計(jì)算預(yù)測(cè)的準(zhǔn)確率。4.2KNN算法的缺點(diǎn)盡管KNN算法具有上述優(yōu)點(diǎn),但它也有一些明顯的缺點(diǎn):計(jì)算成本高:在預(yù)測(cè)階段,KNN算法需要計(jì)算測(cè)試樣本與所有訓(xùn)練樣本之間的距離,這在數(shù)據(jù)量非常大時(shí)會(huì)變得非常耗時(shí)。因此,KNN算法的預(yù)測(cè)速度通常比其他算法慢。內(nèi)存消耗大:KNN算法需要存儲(chǔ)所有的訓(xùn)練數(shù)據(jù),這在數(shù)據(jù)量非常大時(shí)會(huì)占用大量的內(nèi)存。如果內(nèi)存不足,可能無(wú)法使用KNN算法。K值選擇困難:K值的選擇對(duì)KNN算法的性能有顯著影響。如果K值太小,模型可能會(huì)過(guò)擬合;如果K值太大,模型可能會(huì)欠擬合。選擇合適的K值通常需要通過(guò)交叉驗(yàn)證來(lái)確定。受無(wú)關(guān)特征影響:KNN算法對(duì)所有特征都一視同仁,這意味著如果數(shù)據(jù)集中存在無(wú)關(guān)或噪聲特征,它們可能會(huì)影響預(yù)測(cè)結(jié)果。因此,在使用KNN算法之前,通常需要進(jìn)行特征選擇或特征工程。不平衡數(shù)據(jù)集問(wèn)題:在處理不平衡數(shù)據(jù)集時(shí),KNN算法可能會(huì)偏向于數(shù)量較多的類別。例如,如果一個(gè)類別在數(shù)據(jù)集中占90%,而另一個(gè)類別只占10%,那么KNN算法可能會(huì)傾向于預(yù)測(cè)數(shù)量較多的類別。4.2.1示例代碼:KNN回歸下面是一個(gè)使用KNN進(jìn)行回歸的示例代碼,我們將使用scikit-learn庫(kù)中的KNeighborsRegressor。importnumpyasnp
fromsklearn.datasetsimportmake_regression
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.neighborsimportKNeighborsRegressor
fromsklearn.metricsimportmean_squared_error
#生成回歸數(shù)據(jù)
X,y=make_regression(n_samples=1000,n_features=10,noise=0.1)
#劃分訓(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=KNeighborsRegressor(n_neighbors=5)
#訓(xùn)練模型
knn.fit(X_train,y_train)
#預(yù)測(cè)
y_pred=knn.predict(X_test)
#計(jì)算均方誤差
mse=mean_squared_error(y_test,y_pred)
print(f"MeanSquaredError:{mse}")在這個(gè)例子中,我們生成了一個(gè)回歸數(shù)據(jù)集,然后將其劃分為訓(xùn)練集和測(cè)試集。接著,我們創(chuàng)建了一個(gè)KNN回歸器,并使用訓(xùn)練數(shù)據(jù)對(duì)其進(jìn)行訓(xùn)練。最后,我們使用測(cè)試集進(jìn)行預(yù)測(cè),并計(jì)算預(yù)測(cè)的均方誤差??偨Y(jié)上述內(nèi)容,KNN算法在處理分類和回歸問(wèn)題時(shí)具有簡(jiǎn)單直觀、無(wú)需訓(xùn)練過(guò)程、可以處理多分類和非線性問(wèn)題等優(yōu)點(diǎn),但同時(shí)也存在計(jì)算成本高、內(nèi)存消耗大、K值選擇困難、受無(wú)關(guān)特征影響以及處理不平衡數(shù)據(jù)集問(wèn)題時(shí)的局限性。在實(shí)際應(yīng)用中,需要根據(jù)具體問(wèn)題和數(shù)據(jù)集的特點(diǎn)來(lái)權(quán)衡這些優(yōu)缺點(diǎn)。5KNN算法的實(shí)際案例5.1手寫(xiě)數(shù)字識(shí)別5.1.1原理與內(nèi)容K-近鄰算法(KNN)在手寫(xiě)數(shù)字識(shí)別任務(wù)中是一種直觀且有效的分類方法。其核心思想是基于特征空間中的K個(gè)最近鄰樣本的多數(shù)類別來(lái)預(yù)測(cè)新樣本的類別。在手寫(xiě)數(shù)字識(shí)別中,特征空間通常由像素值構(gòu)成,每個(gè)像素值代表圖像中一個(gè)點(diǎn)的灰度值。5.1.2示例代碼與數(shù)據(jù)樣例假設(shè)我們使用MNIST數(shù)據(jù)集,這是一個(gè)包含手寫(xiě)數(shù)字的大型數(shù)據(jù)庫(kù),常用于訓(xùn)練各種圖像處理系統(tǒng)。下面是一個(gè)使用Python和scikit-learn庫(kù)實(shí)現(xiàn)KNN手寫(xiě)數(shù)字識(shí)別的示例:#導(dǎo)入必要的庫(kù)
fromsklearn.datasetsimportfetch_openml
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.preprocessingimportStandardScaler
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.metricsimportaccuracy_score
#加載MNIST數(shù)據(jù)集
mnist=fetch_openml('mnist_784',version=1)
X,y=mnist['data'],mnist['target']
#數(shù)據(jù)預(yù)處理
scaler=StandardScaler()
X_scaled=scaler.fit_transform(X)
#劃分訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X_scaled,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è)
y_pred=knn.predict(X_test)
#計(jì)算準(zhǔn)確率
accuracy=accuracy_score(y_test,y_pred)
print(f'準(zhǔn)確率:{accuracy}')5.1.3代碼講解數(shù)據(jù)加載:使用fetch_openml函數(shù)從開(kāi)放數(shù)據(jù)源中加載MNIST數(shù)據(jù)集。數(shù)據(jù)預(yù)處理:通過(guò)StandardScaler對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,確保每個(gè)特征具有相同的尺度,這對(duì)于KNN算法的性能至關(guān)重要。數(shù)據(jù)劃分:使用train_test_split將數(shù)據(jù)集劃分為訓(xùn)練集和測(cè)試集,其中測(cè)試集占20%。模型創(chuàng)建:實(shí)例化KNeighborsClassifier,設(shè)置n_neighbors=3表示在分類時(shí)考慮最近的3個(gè)鄰居。模型訓(xùn)練:調(diào)用fit方法,使用訓(xùn)練集數(shù)據(jù)和標(biāo)簽訓(xùn)練模型。預(yù)測(cè):使用predict方法對(duì)測(cè)試集進(jìn)行預(yù)測(cè)。評(píng)估:通過(guò)accuracy_score計(jì)算預(yù)測(cè)結(jié)果與真實(shí)標(biāo)簽之間的準(zhǔn)確率。5.2房?jī)r(jià)預(yù)測(cè)5.2.1原理與內(nèi)容KNN算法同樣可以應(yīng)用于回歸任務(wù),如房?jī)r(jià)預(yù)測(cè)。在回歸任務(wù)中,KNN算法預(yù)測(cè)的是連續(xù)值,而不是類別。預(yù)測(cè)過(guò)程涉及找到特征空間中最近的K個(gè)鄰居,然后計(jì)算這些鄰居目標(biāo)值的平均值作為預(yù)測(cè)結(jié)果。5.2.2示例代碼與數(shù)據(jù)樣例下面是一個(gè)使用KNN進(jìn)行房?jī)r(jià)預(yù)測(cè)的Python示例,數(shù)據(jù)集假設(shè)為波士頓房?jī)r(jià)數(shù)據(jù)集:#導(dǎo)入必要的庫(kù)
fromsklearn.datasetsimportload_boston
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.preprocessingimportStandardScaler
fromsklearn.neighborsimportKNeighborsRegressor
fromsklearn.metricsimportmean_squared_error
#加載波士頓房?jī)r(jià)數(shù)據(jù)集
boston=load_boston()
X,y=boston.data,boston.target
#數(shù)據(jù)預(yù)處理
scaler=StandardScaler()
X_scaled=scaler.fit_transform(X)
#劃分訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X_scaled,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)
#計(jì)算均方誤差
mse=mean_squared_error(y_test,y_pred)
print(f'均方誤差:{mse}')5.2.3代碼講解數(shù)據(jù)加載:使用load_boston函數(shù)加載波士頓房?jī)r(jià)數(shù)據(jù)集。數(shù)據(jù)預(yù)處理:通過(guò)StandardScaler對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,確保每個(gè)特征具有相同的尺度。數(shù)據(jù)劃分:使用train_test_split將數(shù)據(jù)集劃分為訓(xùn)練集和測(cè)試集,其中測(cè)試集占20%。模型創(chuàng)建:實(shí)例化KNeighborsRegressor,設(shè)置n_neighbors=5表示在預(yù)測(cè)時(shí)考慮最近的5個(gè)鄰居。模型訓(xùn)練:調(diào)用fit方法,使用訓(xùn)練集數(shù)據(jù)和標(biāo)簽訓(xùn)練模型。預(yù)測(cè):使用predict方法對(duì)測(cè)試集進(jìn)行預(yù)測(cè)。評(píng)估:通過(guò)mean_squared_error計(jì)算預(yù)測(cè)結(jié)果與真實(shí)標(biāo)簽之間的均方誤差,這是回歸任務(wù)中常用的評(píng)估指標(biāo)。通過(guò)以上兩個(gè)示例,我們可以看到KNN算法在分類和回歸任務(wù)中的應(yīng)用,以及如何使用Python和scikit-learn庫(kù)來(lái)實(shí)現(xiàn)這些任務(wù)。在實(shí)際應(yīng)用中,選擇合適的K值和預(yù)處理數(shù)據(jù)是提高模型性能的關(guān)鍵步驟。6KNN算法的參數(shù)調(diào)優(yōu)6.1K值的選擇策略K-近鄰算法(KNN)中,K值的選擇至關(guān)重要,它直接影響模型的性能。選擇較小的K值會(huì)使模型對(duì)噪聲點(diǎn)更加敏感,容易過(guò)擬合;而較大的K值則會(huì)使決策邊界更加平滑,可能引入更多的錯(cuò)誤分類,導(dǎo)致欠擬合。6.1.1示例:使用交叉驗(yàn)證選擇最佳K值fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimportcross_val_score
fromsklearn.neighborsimportKNeighborsClassifier
importnumpyasnp
#加載數(shù)據(jù)集
iris=load_iris()
X,y=iris.data,iris.target
#定義K值范圍
k_range=range(1,31)
#使用交叉驗(yàn)證計(jì)算不同K值下的準(zhǔn)確率
k_scores=[]
forkink_range:
knn=KNeighborsClassifier(n_neighbors=k)
scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy')
k_scores.append(scores.mean())
#找到最佳K值
best_k=k_range[np.argmax(k_scores)]
print(f"BestKvalue:{best_k}")6.2特征縮放的重要性在KNN算法中,特征縮放是必要的,因?yàn)榫嚯x度量(如歐氏距離)對(duì)量綱和量級(jí)敏感。如果一個(gè)特征的范圍遠(yuǎn)大于其他特征,那么這個(gè)特征將主導(dǎo)距離計(jì)算,導(dǎo)致模型性能下降。6.2.1示例:使用標(biāo)準(zhǔn)化進(jìn)行特征縮放fromsklearn.preprocessingimportStandardScaler
#使用StandardScaler進(jìn)行特征縮放
scaler=StandardScaler()
X_scaled=scaler.fit_transform(X)
#使用縮放后的數(shù)據(jù)重新訓(xùn)練模型并選擇K值
k_scores_scaled=[]
forkink_range:
knn=KNeighborsClassifier(n_neighbors=k)
scores=cross_val_score(knn,X_scaled,y,cv=10,scoring='accuracy')
k_scores_scaled.append(scores.mean())
#比較縮放前后的最佳K值
best_k_scaled=k_range[np.argmax(k_scores_scaled)]
print(f"BestKvaluewithscaling:{best_k_scaled}")6.3距離度量的選擇KNN算法中的距離度量選擇也會(huì)影響模型的性能。常見(jiàn)的距離度量有歐氏距離、曼哈頓距離和閔可夫斯基距離等。不同的度量方式適用于不同類型的數(shù)據(jù)分布。6.3.1示例:使用不同距離度量的KNN分類#使用歐氏距離
knn_euclidean=KNeighborsClassifier(n_neighbors=best_k_scaled,metric='euclidean')
knn_euclidean.fit(X_scaled,y)
print("AccuracywithEuclideandistance:",knn_euclidean.score(X_scaled,y))
#使用曼哈頓距離
knn_manhattan=KNeighborsClassifier(n_neighbors=best_k_scaled,metric='manhattan')
knn_manhattan.fit(X_scaled,y)
print("AccuracywithManhattandistance:",knn_manhattan.score(X_scaled,y))
#使用閔可夫斯基距離
knn_minkowski=KNeighborsClassifier(n_neighbors=best_k_scaled,metric='minkowski',p=3)
knn_minkowski.fit(X_scaled,y)
print("AccuracywithMinkowskidistance(p=3):",knn_minkowski.score(X_scaled,y))通過(guò)上述示例,我們可以看到如何通過(guò)交叉驗(yàn)證選擇最佳的K值,如何使用標(biāo)準(zhǔn)化進(jìn)行特征縮放,以及如何嘗試不同的距離度量以優(yōu)化KNN模型的性能。在實(shí)際應(yīng)用中,這些步驟是提高模型準(zhǔn)確性和泛化能力的關(guān)鍵。7KNN算法的擴(kuò)展7.1加權(quán)KNN7.1.1原理在傳統(tǒng)的K-近鄰算法中,每個(gè)鄰居對(duì)預(yù)測(cè)結(jié)果的貢獻(xiàn)是相等的。然而,在實(shí)際應(yīng)用中,距離更近的鄰居可能對(duì)預(yù)測(cè)結(jié)果有更大的影響。加權(quán)KNN通過(guò)賦予不同距離的鄰居不同的權(quán)重來(lái)解決這個(gè)問(wèn)題,通常權(quán)重與距離成反比。這樣,更近的鄰居對(duì)預(yù)測(cè)結(jié)果的影響更大,而較遠(yuǎn)的鄰居影響較小。7.1.2實(shí)現(xiàn)示例假設(shè)我們有以下數(shù)據(jù)集:特征1特征2類別11A22A33B44B55B我們將使用加權(quán)KNN來(lái)預(yù)測(cè)點(diǎn)(2.5,2.5)的類別。importnumpyasnp
fromscipy.spatialimportdistance
#數(shù)據(jù)集
X=np.array([[1,1],[2,2],[3,3],[4,4],[5,5]])
y=np.array(['A','A','B','B','B'])
#預(yù)測(cè)點(diǎn)
x_pred=np.array([2.5,2.5])
#計(jì)算距離
distances=[distance.euclidean(x_pred,x)forxinX]
#K值
K=3
#獲取K個(gè)最近的鄰居
k_indices=np.argsort(distances)[:K]
k_nearest_labels=y[k_indices]
#加權(quán)投票
weights=1/np.array(distances)[k_indices]
weighted_votes={label:np.sum(weights[k_nearest_labels==label])forlabelinnp.unique(k_nearest_labels)}
predicted_label=max(weighted_votes,key=weighted_votes.get)
print(predicted_label)7.1.3解釋在上述代碼中,我們首先計(jì)算了預(yù)測(cè)點(diǎn)與數(shù)據(jù)集中每個(gè)點(diǎn)之間的歐氏距離。然后,我們選擇了距離最近的K個(gè)點(diǎn),并計(jì)算了它們的類別。最后,我們根據(jù)距離的倒數(shù)作為權(quán)重,對(duì)這些類別進(jìn)行加權(quán)投票,以確定預(yù)測(cè)點(diǎn)的類別。7.2自適應(yīng)KNN7.2.1原理自適應(yīng)KNN是一種動(dòng)態(tài)調(diào)整K值的方法,它基于數(shù)據(jù)點(diǎn)的局部密度。在某些區(qū)域,數(shù)據(jù)點(diǎn)可能非常密集,而在其他區(qū)域,數(shù)據(jù)點(diǎn)可能非常稀疏。在密集區(qū)域,較小的K值可能就足夠了,而在稀疏區(qū)域,可能需要較大的K值以確保有足夠的信息。自適應(yīng)KNN通過(guò)計(jì)算每個(gè)數(shù)據(jù)點(diǎn)的局部密度,然后根據(jù)這個(gè)密度來(lái)調(diào)整K值,從而提高預(yù)測(cè)的準(zhǔn)確性。7.2.2實(shí)現(xiàn)示例假設(shè)我們有以下數(shù)據(jù)集:特征1特征2類別11A22A33B44B55B66B我們將使用自適應(yīng)KNN來(lái)預(yù)測(cè)點(diǎn)(2.5,2.5)的類別。importnumpyasnp
fromscipy.spatialimportdistance
#數(shù)據(jù)集
X=np.array([[1,1],[2,2],[3,3],[4,4],[5,5],[6,6]])
y=np.array(['A','A','B','B','B','B'])
#預(yù)測(cè)點(diǎn)
x_pred=np.array([2.5,2.5])
#計(jì)算所有點(diǎn)的局部密度
deflocal_density(X):
distances=distance.cdist(X,X,'euclidean')
sorted_distances=np.sort(distances,axis=1)
returnnp.mean(sorted_distances[:,1:],axis=1)
density=local_density(X)
#動(dòng)態(tài)調(diào)整K值
defadaptive_k(x_pred,X,density,min_k=1,max_k=5):
distances=[distance.euclidean(x_pred,x)forxinX]
k=min_k
whilek<=max_k:
k_indices=np.argsort(distances)[:k]
k_density=np.mean(density[k_indices])
ifk_density>np.mean(density):
break
k+=1
returnk
K=adaptive_k(x_pred,X,density)
#使用調(diào)整后的K值進(jìn)行預(yù)測(cè)
k_indices=np.argsort(distances)[:K]
k_nearest_labels=y[k_indices]
predicted_label=max(set(k_nearest_labels),key=list(k_nearest_labels).count)
print(predicted_label)7.2.3解釋在上述代碼中,我們首先計(jì)算了數(shù)據(jù)集中所有點(diǎn)的局部密度。然后,我們定義了一個(gè)函數(shù)adaptive_k來(lái)動(dòng)態(tài)調(diào)整K值。這個(gè)函數(shù)通過(guò)計(jì)算預(yù)測(cè)點(diǎn)的K個(gè)最近鄰居的平均密度,并與整個(gè)數(shù)據(jù)集的平均密度進(jìn)行比較,來(lái)確定K值。如果K個(gè)最近鄰居的平均密度大于整個(gè)數(shù)據(jù)集的平均密度,那么我們就停止增加K值。最后,我們使用調(diào)整后的K值進(jìn)行預(yù)測(cè)。通過(guò)這種方式,自適應(yīng)KNN可以更好地適應(yīng)數(shù)據(jù)的局部特性,從而提高預(yù)測(cè)的準(zhǔn)確性。8KNN算法的總結(jié)K-近鄰算法(KNN)是一種基于實(shí)例的學(xué)習(xí)方法,它在分類和回歸任務(wù)中都有廣泛應(yīng)用。KNN算法的核心思想是,對(duì)于一個(gè)未知樣本,通過(guò)計(jì)算其與訓(xùn)練集中所有樣本的距離,選取距離最近的K個(gè)樣本,然后根據(jù)這K個(gè)樣本的類別或數(shù)值來(lái)預(yù)測(cè)未知樣本的類別或數(shù)值。8.1分類任務(wù)中的KNN在分類任務(wù)中,KNN算法通常采用多數(shù)表決的方式進(jìn)行預(yù)測(cè)。具體步驟如下:計(jì)算距離:計(jì)算測(cè)試樣本與訓(xùn)練集中每個(gè)樣本的距離。找到K個(gè)最近鄰:從訓(xùn)練集中選取距離最近的K個(gè)樣本。多數(shù)表決:這K個(gè)樣本中出現(xiàn)次數(shù)最多的類別作為測(cè)試樣本的預(yù)測(cè)類別。8.2回歸任務(wù)中的KNN在回歸任務(wù)中,KNN算法通常采用平均值或加權(quán)平均值的方式進(jìn)行預(yù)測(cè)。具體步驟如下:計(jì)算距離:與分類任務(wù)相同,計(jì)算測(cè)試樣本與訓(xùn)練集中每個(gè)樣本的距離。找到K個(gè)最近鄰:從訓(xùn)練集中選取距離最近的K個(gè)樣本。預(yù)測(cè)數(shù)值:這K個(gè)樣本的目
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 腳手架施工安全責(zé)任合同
- 體育賽事信息系統(tǒng)建設(shè)方案
- 家長(zhǎng)會(huì)攝影服務(wù)合同
- 醫(yī)院無(wú)線網(wǎng)絡(luò)部署方案
- 文化交流活動(dòng)讀物選擇制度
- 2024至2030年中國(guó)擋風(fēng)抑塵墻行業(yè)投資前景及策略咨詢研究報(bào)告
- 2024至2030年差速器鑄件項(xiàng)目投資價(jià)值分析報(bào)告
- 醫(yī)生黨課課件教學(xué)課件
- 神經(jīng)內(nèi)科電場(chǎng)治療方案
- 新人入職培訓(xùn)規(guī)章制度
- 部編版語(yǔ)文三年級(jí)上冊(cè)單元知識(shí)點(diǎn)梳理歸納
- TS16949推行計(jì)劃
- 關(guān)于統(tǒng)一使用公司手機(jī)號(hào)碼的通知
- 標(biāo)準(zhǔn)吞咽功能評(píng)價(jià)量表(SSA)2頁(yè)
- 2009年勒流街道小學(xué)即席作文競(jìng)賽獲獎(jiǎng)結(jié)果(精)
- 三年級(jí)地方課程半島工程和溫州大橋教材
- 人民醫(yī)院便民惠民措施服務(wù)工作開(kāi)展情況總結(jié)
- 用友華表伙伴商務(wù)手冊(cè).
- 大學(xué)生健康人格與心理健康PPT課件
- 有限空間安全操作責(zé)任協(xié)議書(shū)(3頁(yè))
- 網(wǎng)格化管理架構(gòu)圖新
評(píng)論
0/150
提交評(píng)論