溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python可視化實現KNN算法

發(fā)布時間:2020-09-22 07:30:43 來源:腳本之家 閱讀:261 作者:Kalankalan 欄目:開發(fā)技術

簡介

這里通過python的繪圖工具Matplotlib包可視化實現機器學習中的KNN算法。

需要提前安裝python的Numpy和Matplotlib包。

KNN–最近鄰分類算法,算法邏輯比較簡單,思路如下:

1.設一待分類數據iData,先計算其到已標記數據集中每個數據的距離,例如歐拉距離sqrt((x1-x2)^2+(y1-y2)^2);

2.然后根據離iData最近的k個數據的分類,出現次數最多的類別定為iData的分類。

KNN——最近鄰算法python代碼

代碼實現:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

def KNNClassify(labelData,predData,k): #數據集包含分類屬性
#labelData 是已經標記分類的數據集
#predData 未分類的待預測數據集
 labShape = labelData.shape
 for i in range(predData.shape[0]): #以predData的每行數據進行遍歷
 iData = predData[i]
 iDset = np.tile(iData,(labShape[0],1)) #將iData重復,擴展成與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個標記數據的類別
 voteLabel = labelData[sortedIND[j],-1]
 classCount[voteLabel] = classCount.get(voteLabel,0)+1

 maxcls = max(classCount,key=classCount.get) #類別最多的,返回鍵名(類別名)
 predData[i][...,-1] = maxcls

 return predData

為了測試這個算法,需要現成的已分類數據集,由于手動輸入很有限,數據量少,耗時。作為學習我們這里用代碼模擬生成數據來進行測試。下面是生成已分類數據集的代碼:

生成模擬數據的函數

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#模擬生成分類數據
#目標是產生二維坐標中的幾堆數據集,每堆為一個類
#函數邏輯:
#將x軸分段,每個段設一個中心的,所有的中心點用cores存儲。
#設置每個數據中心點core的類別,由中心點在一定范圍內隨機產生數據,并將這些數據設為和core一樣的類別
#所以每類的數據會簡單的被X軸的每段大致分開

def makeKNNData(colnum,clsnum,nums,cores = []):
#colnum單個數據擁有特征數量(包括數據的分類);
# clsnum表示共有多少種分類;
# nums是一個元組,表示每個類別希望產生多少數據樣本,如colnum為5,nums為[56, 69, 60, 92, 95];
#cores非必要參數,手動給出只是用于測試,cores提供每類的中心點,以中心點為依據產生該類數據。

 dataSet = np.zeros((sum(nums),colnum)) #初始化數據集,用于存放隨后生成的所有數據
 n=0 #記錄生成數據的下標
 step = 20/clsnum #假定X坐標軸只顯示0~20的范圍,step為X軸分段后的段長
 for j in range(clsnum): #循環(huán)生成各個類數據
 try:
 core = cores[j] #如果cores沒有給出則,則出錯,跳至except執(zhí)行
 except IndexError :
 core = np.random.rand(1,3) #中心點為array([[x1,x2,c]]),c用于表示類別,這里產生的是1*3的二維數組
 core[0][0] =j*step + core[0][0]*step #將x1限制在各段中
 core[0][1] *=15 #將x2即y軸限制在0~15范圍內
 core[0][2] = j #設置類別
 cores.append(core)
 for i in range(nums[j]): #按nums中指定了每類數據的數量,用循環(huán)生成。
 point= core[0][:2] + np.random.rand(1,2)*step -step/2 #產生點point(x,y),x以中心點在(core_x - step/2, core_x + step/2)范圍隨機波動,y同理。
 row = np.column_stack((point,core[0][2])) #加上類別成為一個數據
 dataSet[n] = row
 n +=1
 i +=1

 j +=1

 #print("print cores:",cores)
 return dataSet

有了數據集之后,我們可以用Matplotlib將數據可視化,以直觀顯示出來

數據可視化函數

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#繪圖展示數據,每類數據點以不同的顏色顯示
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()


#測試一下
#需要結合模擬生成數據的函數
classnum = 5
nums = np.random.randint(50,100,classnum) #示例 array([56, 69, 60, 92, 95]),每個數字在50~100范圍內
dataSet = makeKNNData(3,classnum,nums)
showFigure(dataSet,classnum)

生成的模擬數據展示結果如下:

python可視化實現KNN算法

完整代碼

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#模擬生成分類數據
#目標是產生二維坐標中的幾堆數據集,每堆為一個類
#函數邏輯:
#將x軸分段,每個段設一個中心的,所有的中心點用cores存儲。
#設置每個數據中心點core的類別,由中心點在一定范圍內隨機產生數據,并將這些數據設為和core一樣的類別
#所以每類的數據會簡單的被X軸的每段大致分開

def makeKNNData(colnum,clsnum,nums,cores = []):
#colnum單個數據擁有特征數量(包括數據的分類);
# clsnum表示共有多少種分類;
# nums是一個元組,表示每個類別希望產生多少數據樣本;
#cores非必要參數,手動給出只是用于測試,cores提供每類的中心點,以中心點為依據產生該類數據。

 dataSet = np.zeros((sum(nums),colnum)) #初始化數據集,用于存放隨后生成的所有數據
 n=0 #記錄生成數據的下標
 step = 20/clsnum #假定X坐標軸只顯示0~20的范圍,step為X軸分段后的段長
 for j in range(clsnum): #循環(huán)生成各個類數據
 try:
 core = cores[j] #如果cores沒有給出則,則出錯,跳至except執(zhí)行
 except IndexError :
 core = np.random.rand(1,3) #中心點為array([[x1,x2,c]]),c用于表示類別,這里產生的是1*3的二維數組
 core[0][0] =j*step + core[0][0]*step #將x1限制在各段中
 core[0][1] *=15 #將x2即y軸限制在0~15范圍內
 core[0][2] = j #設置類別
 cores.append(core)
 for i in range(nums[j]): #按nums中指定了每類數據的數量,用循環(huán)生成。
 point= core[0][:2] + np.random.rand(1,2)*step -step/2 #產生點point(x,y),x以中心點在(core_x - step/2, core_x + step/2)范圍隨機波動,y同理。
 row = np.column_stack((point,core[0][2])) #加上類別成為一個數據
 dataSet[n] = row
 n +=1
 i +=1

 j +=1

 #print("print cores:",cores)
 return dataSet

#繪圖展示數據,每類數據點以不同的顏色顯示
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()


#分類算法:
#待分類數據iData,先計算其到已標記數據集中每個數據的距離
#然后根據離iData最近的k個數據的分類,出現次數最多的類別定為iData的分類。

def KNNClassify(labelData,predData,k): #數據集包含分類屬性
#labelData 是已經標記分類的數據集
#predData 待預測數據集
 labShape = labelData.shape
 for i in range(predData.shape[0]): #以predData的每行數據進行遍歷
 iData = predData[i]
 iDset = np.tile(iData,(labShape[0],1)) #將iData重復,擴展成與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個標記數據的類別
 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) #這里為了方便,不在寫產生待分類數據的代碼,只需用之前的函數并忽略其類別就好。
predData[...,-1]=0
showFigure(predData,classnum)

k = 10
KNNData = KNNClassify(labelData,predData,k)
showFigure(KNNData,classnum)

運行程序,結果如下:

1.labelData的數據(已知分類的數據) 

 python可視化實現KNN算法

2.predData的數據(未標記的數據) 

 python可視化實現KNN算法

3KNNData的數據(用KNN算法進行分類后的數據)

python可視化實現KNN算法

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI