k鄰近算法(KNN)實例


一 k近鄰算法原理

k近鄰算法是一種基本分類和回歸方法.

原理:K近鄰算法,即是給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的K個實例,這K個實例的
多數屬於某個類,就把該輸入實例分類到這個類中。

 

如上圖所示,有兩類不同的樣本數據,分別用藍色的小正方形和紅色的小三角形表示,而圖正中間的那個綠色的圓所標示的數據則是待分類的數據。這也就是我們的目的,來了一個新的數據點,我要得到它的類別是什么?好的,下面我們根據k近鄰的思想來給綠色圓點進行分類。

 

  • 如果K=3,綠色圓點的最鄰近的3個點是2個紅色小三角形和1個藍色小正方形,少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於紅色的三角形一類。
  • 如果K=5,綠色圓點的最鄰近的5個鄰居是2個紅色三角形和3個藍色的正方形,還是少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於藍色的正方形一類。

 

參考一文搞懂k近鄰(k-NN)算法(一) https://zhuanlan.zhihu.com/p/25994179

二  特點

優點:精度高(計算距離)、對異常值不敏感(單純根據距離進行分類,會忽略特殊情況)、無數據輸入假定
  (不會對數據預先進行判定)。 缺點:時間復雜度高、空間復雜度高。 適用數據范圍:數值型和標稱型。

 

三 歐氏距離(Euclidean Distance)

歐氏距離是最常見的距離度量,衡量的是多維空間中各個點之間的絕對距離。公式如下:

 

四  sklearn庫中使用k鄰近算法

  • 分類問題:from sklearn.neighbors import KNeighborsClassifier
  • 回歸問題:from sklearn.neighbors import KNeighborsRegressor

 

五 使用sklearn的K鄰近簡單實例

1 數據藍蝴蝶

#導包
import numpy as np
import pandas  as pd
from pandas import DataFrame,Series
from sklearn.neighbors import KNeighborsClassifier #k鄰近算法模型

#使用datasets創建數據
import sklearn.datasets as datasets
iris = datasets.load_iris()

feature = iris['data']
target = iris['target']

#將樣本打亂,符合真實情況

np.random.seed(1)
np.random.shuffle(feature)
np.random.seed(1)
np.random.shuffle(target)

#訓練數據
x_train = feature[:140]
y_train = target[:140]
#測試數據
x_test = feature[-10:]
y_test =target[-10:]

#實例化模型對象&訓練模型
knn = KNeighborsClassifier(n_neighbors=10)
knn.fit(x_train,y_train)
knn.score(x_train,y_train)

print('預測分類:',knn.predict(x_test))
print('真實分類:',y_test)

 

2 根據身高、體重、鞋子尺碼,預測性別

#導包
import numpy as np
import pandas  as pd
from pandas import DataFrame,Series

#手動創建訓練數據集
feature = np.array([[170,65,41],[166,55,38],[177,80,39],[179,80,43],[170,60,40],[170,60,38]])
target = np.array(['','','','','',''])

from sklearn.neighbors import KNeighborsClassifier #k鄰近算法模型

#實例k鄰近模型,指定k值=3
knn = KNeighborsClassifier(n_neighbors=3)

#訓練數據
knn.fit(feature,target)

#模型評分
knn.score(feature,target)

#預測
knn.predict(np.array([[176,71,38]]))

 

 3 手寫數字識別

  • 導包
import numpy as np 
import pandas as pd
from pandas import DataFrame,Series
import matplotlib.pyplot as plt

from sklearn.neighbors import KNeighborsClassifier

 

  • 查看單一圖片特征
img=plt.imread('data/0/0_2.bmp')
plt.imshow(img)

 

  • 提煉樣本數據
feature=[]
target=[]
for i in range(10):
    for j in range(500):
        img_arr=plt.imread(f'data/{i}/{i}_{j+1}.bmp')
        feature.append(img_arr)
        target.append(i)

#構建特征數據格式
feature=np.array(feature)
target=np.array(target)

feature.shape #(5000, 28, 28)

#輸入數據必須是二維數組,必須對feature降維
#(1)降維方式一:mean() (2)降維方式二:reshape()
feature=feature.reshape(5000,28*28)

#將樣本打亂 (必須使用多個seed)
np.random.seed(5)
np.random.shuffle(feature)
np.random.seed(5)
np.random.shuffle(target)

#數據分割為訓練數據和測試數據
x_train=feature[:4950]
y_train=target[:4950]
x_test=feature[-50:]
y_test=target[-50:]

 

  • KNN模型建立和評分
#訓練模型
knn.fit(x_train,y_train)

#評分
knn.score(x_train,y_train)

#預測
# knn.predict(x_test)

 

  • 真實預測手寫數字圖片的一般流程
# 讀取圖片數據
num_img_arr=plt.imread('../../數字.jpg')
plt.imshow(num_img_arr)

 

#圖片截取數字5
five_arr=num_img_arr[90:158,80:132]
plt.imshow(five_arr)

#降維操作(five數組是三維的,需要進行降維,舍棄第三個表示顏色的維度)
print(five_arr.shape) #(65, 56, 3)
five=five_arr.mean(axis=2)
print(five.shape) #(65, 56)
plt.imshow(five)

# 圖片壓縮為像素28*28
import scipy.ndimage as ndimage
five = ndimage.zoom(five,zoom = (28/68,28/52))
five.shape #(28, 28)

# 壓縮后的5的顯示
plt.imshow(five)

# 把數據降維為feature 數據格式
five.reshape(1,28*28)
#預測
knn.predict(five.reshape(1,28*28))

 

下載源數據和代碼:https://github.com/angleboygo/data_ansys

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM