python可視化實現(xiàn)KNN算法
簡介
這里通過python的繪圖工具Matplotlib包可視化實現(xiàn)機器學習中的KNN算法。
需要提前安裝python的Numpy和Matplotlib包。
KNN–最近鄰分類算法,算法邏輯比較簡單,思路如下:
1.設(shè)一待分類數(shù)據(jù)iData,先計算其到已標記數(shù)據(jù)集中每個數(shù)據(jù)的距離,例如歐拉距離sqrt((x1-x2)^2+(y1-y2)^2);
2.然后根據(jù)離iData最近的k個數(shù)據(jù)的分類,出現(xiàn)次數(shù)最多的類別定為iData的分類。
KNN——最近鄰算法python代碼
代碼實現(xiàn):
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt def KNNClassify(labelData,predData,k): #數(shù)據(jù)集包含分類屬性 #labelData 是已經(jīng)標記分類的數(shù)據(jù)集 #predData 未分類的待預(yù)測數(shù)據(jù)集 labShape = labelData.shape for i in range(predData.shape[0]): #以predData的每行數(shù)據(jù)進行遍歷 iData = predData[i] iDset = np.tile(iData,(labShape[0],1)) #將iData重復(fù),擴展成與labelData同形的矩陣 #這里用歐拉距離sqrt((x1-x2)^2+(y1-y2)^2) diff = iDset[...,:-1] - labelData[...,:-1] diff = diff**2 distance = np.sum(diff,axis=1) distance = distance ** 0.5 #開根號 sortedIND = np.argsort(distance) #排序,以序號返回。 classCount = { } for j in range(k): #計算距離最近的前k個標記數(shù)據(jù)的類別 voteLabel = labelData[sortedIND[j],-1] classCount[voteLabel] = classCount.get(voteLabel,0)+1 maxcls = max(classCount,key=classCount.get) #類別最多的,返回鍵名(類別名) predData[i][...,-1] = maxcls return predData
為了測試這個算法,需要現(xiàn)成的已分類數(shù)據(jù)集,由于手動輸入很有限,數(shù)據(jù)量少,耗時。作為學習我們這里用代碼模擬生成數(shù)據(jù)來進行測試。下面是生成已分類數(shù)據(jù)集的代碼:
生成模擬數(shù)據(jù)的函數(shù)
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt #模擬生成分類數(shù)據(jù) #目標是產(chǎn)生二維坐標中的幾堆數(shù)據(jù)集,每堆為一個類 #函數(shù)邏輯: #將x軸分段,每個段設(shè)一個中心的,所有的中心點用cores存儲。 #設(shè)置每個數(shù)據(jù)中心點core的類別,由中心點在一定范圍內(nèi)隨機產(chǎn)生數(shù)據(jù),并將這些數(shù)據(jù)設(shè)為和core一樣的類別 #所以每類的數(shù)據(jù)會簡單的被X軸的每段大致分開 def makeKNNData(colnum,clsnum,nums,cores = []): #colnum單個數(shù)據(jù)擁有特征數(shù)量(包括數(shù)據(jù)的分類); # clsnum表示共有多少種分類; # nums是一個元組,表示每個類別希望產(chǎn)生多少數(shù)據(jù)樣本,如colnum為5,nums為[56, 69, 60, 92, 95]; #cores非必要參數(shù),手動給出只是用于測試,cores提供每類的中心點,以中心點為依據(jù)產(chǎn)生該類數(shù)據(jù)。 dataSet = np.zeros((sum(nums),colnum)) #初始化數(shù)據(jù)集,用于存放隨后生成的所有數(shù)據(jù) n=0 #記錄生成數(shù)據(jù)的下標 step = 20/clsnum #假定X坐標軸只顯示0~20的范圍,step為X軸分段后的段長 for j in range(clsnum): #循環(huán)生成各個類數(shù)據(jù) try: core = cores[j] #如果cores沒有給出則,則出錯,跳至except執(zhí)行 except IndexError : core = np.random.rand(1,3) #中心點為array([[x1,x2,c]]),c用于表示類別,這里產(chǎn)生的是1*3的二維數(shù)組 core[0][0] =j*step + core[0][0]*step #將x1限制在各段中 core[0][1] *=15 #將x2即y軸限制在0~15范圍內(nèi) core[0][2] = j #設(shè)置類別 cores.append(core) for i in range(nums[j]): #按nums中指定了每類數(shù)據(jù)的數(shù)量,用循環(huán)生成。 point= core[0][:2] + np.random.rand(1,2)*step -step/2 #產(chǎn)生點point(x,y),x以中心點在(core_x - step/2, core_x + step/2)范圍隨機波動,y同理。 row = np.column_stack((point,core[0][2])) #加上類別成為一個數(shù)據(jù) dataSet[n] = row n +=1 i +=1 j +=1 #print("print cores:",cores) return dataSet
有了數(shù)據(jù)集之后,我們可以用Matplotlib將數(shù)據(jù)可視化,以直觀顯示出來
數(shù)據(jù)可視化函數(shù)
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt #繪圖展示數(shù)據(jù),每類數(shù)據(jù)點以不同的顏色顯示 def showFigure(dataSet,clsnum): fig = plt.figure() ax = fig.add_subplot(1,1,1) #界面只需顯示一個視圖 ax.set_title('KNN separable data set') #視圖名稱,這里簡單統(tǒng)一定這個名稱吧 plt.xlabel('X') #坐標軸名稱 plt.ylabel('Y') colors = ['r','g','b','y','k'] #定義顯示的顏色b為blue,k為black for i in range(clsnum): idx = np.where(dataSet[:,2] == i) #查詢每類的索引號 ax.scatter(dataSet[idx,0], dataSet[idx,1], marker='o', color=colors[i%5], label=1, s=10) #在視圖中的顯示方式 plt.legend(loc = 'upper right') #圖例顯示位置 plt.show() #測試一下 #需要結(jié)合模擬生成數(shù)據(jù)的函數(shù) classnum = 5 nums = np.random.randint(50,100,classnum) #示例 array([56, 69, 60, 92, 95]),每個數(shù)字在50~100范圍內(nèi) dataSet = makeKNNData(3,classnum,nums) showFigure(dataSet,classnum)
生成的模擬數(shù)據(jù)展示結(jié)果如下:
完整代碼
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt #模擬生成分類數(shù)據(jù) #目標是產(chǎn)生二維坐標中的幾堆數(shù)據(jù)集,每堆為一個類 #函數(shù)邏輯: #將x軸分段,每個段設(shè)一個中心的,所有的中心點用cores存儲。 #設(shè)置每個數(shù)據(jù)中心點core的類別,由中心點在一定范圍內(nèi)隨機產(chǎn)生數(shù)據(jù),并將這些數(shù)據(jù)設(shè)為和core一樣的類別 #所以每類的數(shù)據(jù)會簡單的被X軸的每段大致分開 def makeKNNData(colnum,clsnum,nums,cores = []): #colnum單個數(shù)據(jù)擁有特征數(shù)量(包括數(shù)據(jù)的分類); # clsnum表示共有多少種分類; # nums是一個元組,表示每個類別希望產(chǎn)生多少數(shù)據(jù)樣本; #cores非必要參數(shù),手動給出只是用于測試,cores提供每類的中心點,以中心點為依據(jù)產(chǎn)生該類數(shù)據(jù)。 dataSet = np.zeros((sum(nums),colnum)) #初始化數(shù)據(jù)集,用于存放隨后生成的所有數(shù)據(jù) n=0 #記錄生成數(shù)據(jù)的下標 step = 20/clsnum #假定X坐標軸只顯示0~20的范圍,step為X軸分段后的段長 for j in range(clsnum): #循環(huán)生成各個類數(shù)據(jù) try: core = cores[j] #如果cores沒有給出則,則出錯,跳至except執(zhí)行 except IndexError : core = np.random.rand(1,3) #中心點為array([[x1,x2,c]]),c用于表示類別,這里產(chǎn)生的是1*3的二維數(shù)組 core[0][0] =j*step + core[0][0]*step #將x1限制在各段中 core[0][1] *=15 #將x2即y軸限制在0~15范圍內(nèi) core[0][2] = j #設(shè)置類別 cores.append(core) for i in range(nums[j]): #按nums中指定了每類數(shù)據(jù)的數(shù)量,用循環(huán)生成。 point= core[0][:2] + np.random.rand(1,2)*step -step/2 #產(chǎn)生點point(x,y),x以中心點在(core_x - step/2, core_x + step/2)范圍隨機波動,y同理。 row = np.column_stack((point,core[0][2])) #加上類別成為一個數(shù)據(jù) dataSet[n] = row n +=1 i +=1 j +=1 #print("print cores:",cores) return dataSet #繪圖展示數(shù)據(jù),每類數(shù)據(jù)點以不同的顏色顯示 def showFigure(dataSet,clsnum): fig = plt.figure() ax = fig.add_subplot(1,1,1) #界面只需顯示一個視圖 ax.set_title('KNN separable data set') #視圖名稱,這里簡單統(tǒng)一定這個名稱吧 plt.xlabel('X') #坐標軸名稱 plt.ylabel('Y') colors = ['r','g','b','y','k'] #定義顯示的顏色b為blue,k為black for i in range(clsnum): idx = np.where(dataSet[:,2] == i) #查詢每類的索引號 ax.scatter(dataSet[idx,0], dataSet[idx,1], marker='o', color=colors[i%5], label=1, s=10) #在視圖中的顯示方式 plt.legend(loc = 'upper right') #圖例顯示位置 plt.show() #分類算法: #待分類數(shù)據(jù)iData,先計算其到已標記數(shù)據(jù)集中每個數(shù)據(jù)的距離 #然后根據(jù)離iData最近的k個數(shù)據(jù)的分類,出現(xiàn)次數(shù)最多的類別定為iData的分類。 def KNNClassify(labelData,predData,k): #數(shù)據(jù)集包含分類屬性 #labelData 是已經(jīng)標記分類的數(shù)據(jù)集 #predData 待預(yù)測數(shù)據(jù)集 labShape = labelData.shape for i in range(predData.shape[0]): #以predData的每行數(shù)據(jù)進行遍歷 iData = predData[i] iDset = np.tile(iData,(labShape[0],1)) #將iData重復(fù),擴展成與labelData同形的矩陣 #這里用歐拉距離sqrt((x1-x2)^2+(y1-y2)^2) diff = iDset[...,:-1] - labelData[...,:-1] diff = diff**2 distance = np.sum(diff,axis=1) distance = distance ** 0.5 #開根號 sortedIND = np.argsort(distance) #排序,以序號返回。 classCount = { } for j in range(k): #計算距離最近的前k個標記數(shù)據(jù)的類別 voteLabel = labelData[sortedIND[j],-1] classCount[voteLabel] = classCount.get(voteLabel,0)+1 maxcls = max(classCount,key=classCount.get) #類別最多的,返回鍵名(類別名) predData[i][...,-1] = maxcls return predData #測試 labNums = np.random.randint(50,200,classnum) predNums = np.random.randint(10,80,classnum) #cores = [np.array([[ 0.08321641, 12.22596938, 0. ]]), np.array([[9.99891798, 4.24009775, 1. ]]), np.array([[14.98097374, 9.80120399, 2. ]])] labelData = makeKNNData(3,classnum,labNums) showFigure(labelData,classnum) predData = makeKNNData(3,classnum,predNums) #這里為了方便,不在寫產(chǎn)生待分類數(shù)據(jù)的代碼,只需用之前的函數(shù)并忽略其類別就好。 predData[...,-1]=0 showFigure(predData,classnum) k = 10 KNNData = KNNClassify(labelData,predData,k) showFigure(KNNData,classnum)
運行程序,結(jié)果如下:
1.labelData的數(shù)據(jù)(已知分類的數(shù)據(jù))
2.predData的數(shù)據(jù)(未標記的數(shù)據(jù))
3KNNData的數(shù)據(jù)(用KNN算法進行分類后的數(shù)據(jù))
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- K近鄰法(KNN)相關(guān)知識總結(jié)以及如何用python實現(xiàn)
- python實現(xiàn)KNN近鄰算法
- Python圖像識別+KNN求解數(shù)獨的實現(xiàn)
- 原生python實現(xiàn)knn分類算法
- 使用python實現(xiàn)kNN分類算法
- python實現(xiàn)KNN分類算法
- Python實現(xiàn)KNN(K-近鄰)算法的示例代碼
- 基于python實現(xiàn)KNN分類算法
- Python機器學習之scikit-learn庫中KNN算法的封裝與使用方法
- 在python中利用KNN實現(xiàn)對iris進行分類的方法
- Python機器學習之KNN近鄰算法
相關(guān)文章
selenium動態(tài)數(shù)據(jù)獲取的方法實現(xiàn)
本文主要介紹了selenium動態(tài)數(shù)據(jù)獲取的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07pyinstaller打包多個py文件和去除cmd黑框的方法
今天小編就為大家分享一篇pyinstaller打包多個py文件和去除cmd黑框的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06使用Python下載歌詞并嵌入歌曲文件中的實現(xiàn)代碼
這篇文章主要介紹了使用Python下載歌詞并嵌入歌曲文件中的實現(xiàn)代碼,需要借助eyed3模塊,需要的朋友可以參考下2015-11-11

BP神經(jīng)網(wǎng)絡(luò)原理及Python實現(xiàn)代碼

Python提取PDF發(fā)票信息保存Excel文件并制作EXE程序的全過程