KNN算法 使用KNN对iris数据集分类
生活随笔
收集整理的這篇文章主要介紹了
KNN算法 使用KNN对iris数据集分类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、KNN算法 (K近鄰算法) 簡述
可以簡單粗暴的認為在判斷一個未知事物時,可以觀察離它最近的幾個樣本。
步驟:
尋找樣本數據集K個最近的元素
計算K個元素中各種類別的占比
占比最高的類別即為新數據的類別
K的取值對結果有很大的影響
如下圖,中間的圓要被賦予哪個類?是三角形還是正方形?如果K=3,由于三角形所占比例為2/3,圓將被賦予三角形那個類;如果K=7,由于正方形所占比例為4/7,圓將被賦予正方形那個類
計算復雜度優化
- 計算新數據(未知樣本)和K個訓練樣本的距離dist;
- 得到目前K個最鄰近樣本中的最大距離maxdist;
- 如果第K+1個訓練樣本......(剩余的所有訓練樣本)的dist小于maxdist,則將該訓練樣本作為K-最近鄰樣本(即替換掉上述K個最鄰近樣本中最大距離的那個訓練樣本)。
邊界清晰--選取中心點 純度?
數據傾斜問題-- 增加權重
二、使用KNN對iris數據集分類
1、導入numpy、Matplotlib、sklearn類庫及其模塊
import numpy as np # Puplot 提供了一套和MATLAB類似的繪圖API,使得Matplotlib的機制更像MATLAB。 # 我們只需要調用Pyplot模塊所提供的函數就可以快速繪圖并設置圖表的各個細節 import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from sklearn.neighbors import KNeighborsClassifier # 導入sklearn類庫及KNN模型 from sklearn.datasets import load_iris?2、加載鳶尾花數據集
# 加載鳶尾花數據集,并分割成樣本特征X和樣本標簽Y iris = load_iris() X = iris.data[:,:2] # print(X) # print(X[:,0]) Y = iris.target3、設置繪圖背景色和散點顏色映射表
# 繪制背景顏色和散點顏色映射表 cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF']) cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF'])4、 構建KNN模型
clf = KNeighborsClassifier(n_neighbors= 10,weights='uniform')5、?調用模型的fit函數進行訓練
clf.fit(X,Y)6、畫出決策邊界
# 畫出決策邊界 x_min , x_max = X[:,0].min() - 1, X[:,0].max() + 1 y_min , y_max = X[:,1].min() - 1, X[:,1].max() + 1 xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),np.arange(y_min,y_max,0.02))Z = clf.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)plt.figure() plt.pcolormesh(xx,yy,Z,cmap=cmap_light)?7、繪制預測結果圖
# 繪制預測結果圖 plt.scatter(X[:,0],X[:,1],c = Y,cmap=cmap_bold) plt.xlim(xx.min(),xx.max()) # xlim:當前圖形X軸的范圍 plt.ylim(yy.min(),yy.max()) plt.title('3_Class(k=10,weights=uniform)') plt.show?8、結果展示
部分解釋
1、numpy.meshgrid()
(參考https://www.cnblogs.com/black-mamba/p/9186965.html)
x = np.array([0, 0.5, 1]) print('x: ',x) print('--------------') y = np.array([0,1]) xv,yv = np.meshgrid(x, y) # numpy.meshgrid(x軸上的坐標向量, y軸上的坐標向量) print('xv: \n',xv) print('--------------') print('y: ',y) print('--------------') print('yv: \n',yv) print("xv的維度:{},shape:{}".format(xv.ndim, xv.shape)) print("yv的維度:{},shape:{}".format(yv.ndim, yv.shape))plt.plot(xv, yv, 'o--') plt.grid(True) plt.show()?
# 此處為了好觀看結果,將步長設置為1 print((np.arange(x_min,x_max,1)))?
print((np.arange(y_min,y_max,1)))?
?
2、numpy.c_?
# numpy.c_ 將一維數組作為列堆疊到二維數組中。 arr = np.c_[np.array([1,2,3]), np.array([4,5,6])] print(arr)?
3、ravel()
ravel()方法將數組維度拉成一維數組
print((np.c_[xx.ravel(),yy.ravel()]))代碼:
import numpy as np # Puplot 提供了一套和MATLAB類似的繪圖API,使得Matplotlib的機制更像MATLAB。 # 我們只需要調用Pyplot模塊所提供的函數就可以快速繪圖并設置圖表的各個細節 import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from sklearn.neighbors import KNeighborsClassifier # 導入sklearn類庫及KNN模型 from sklearn.datasets import load_iris# 加載鳶尾花數據集,并分割成樣本特征X和樣本標簽Y iris = load_iris() X = iris.data[:,:2] # print(X) # print(X[:,0]) Y = iris.target# 繪制背景顏色和散點顏色映射表 cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF']) cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF'])clf = KNeighborsClassifier(n_neighbors= 10,weights='uniform') clf.fit(X,Y)# 畫出決策邊界 x_min , x_max = X[:,0].min() - 1, X[:,0].max() + 1 y_min , y_max = X[:,1].min() - 1, X[:,1].max() + 1 xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),np.arange(y_min,y_max,0.02))Z = clf.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)plt.figure() plt.pcolormesh(xx,yy,Z,cmap=cmap_light) # 這兩部分代碼一塊執行# 繪制預測結果圖 plt.scatter(X[:,0],X[:,1],c = Y,cmap=cmap_bold) plt.xlim(xx.min(),xx.max()) # xlim:當前圖形X軸的范圍 plt.ylim(yy.min(),yy.max()) plt.title('3_Class(k=10,weights=uniform)') plt.show?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的KNN算法 使用KNN对iris数据集分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 少写点if-else吧,它的效率有多低你
- 下一篇: C语言指针:从底层原理到花式技巧,用图文