最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python可視化實(shí)現(xiàn)KNN算法

 更新時(shí)間:2019年10月16日 10:45:08   作者:Kalankalan  
這篇文章主要為大家詳細(xì)介紹了python可視化實(shí)現(xiàn)KNN算法,通過(guò)繪圖工具M(jìn)atplotlib包可視化實(shí)現(xiàn)機(jī)器學(xué)習(xí)中的KNN算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

簡(jiǎn)介

這里通過(guò)python的繪圖工具M(jìn)atplotlib包可視化實(shí)現(xiàn)機(jī)器學(xué)習(xí)中的KNN算法。

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

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

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

2.然后根據(jù)離iData最近的k個(gè)數(shù)據(jù)的分類,出現(xiàn)次數(shù)最多的類別定為iData的分類。

KNN——最近鄰算法python代碼

代碼實(shí)現(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)標(biāo)記分類的數(shù)據(jù)集
#predData 未分類的待預(yù)測(cè)數(shù)據(jù)集
 labShape = labelData.shape
 for i in range(predData.shape[0]): #以predData的每行數(shù)據(jù)進(jìn)行遍歷
 iData = predData[i]
 iDset = np.tile(iData,(labShape[0],1)) #將iData重復(fù),擴(kuò)展成與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 #開(kāi)根號(hào)
 sortedIND = np.argsort(distance) #排序,以序號(hào)返回。
 classCount = { }
 for j in range(k): #計(jì)算距離最近的前k個(gè)標(biāo)記數(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

為了測(cè)試這個(gè)算法,需要現(xiàn)成的已分類數(shù)據(jù)集,由于手動(dòng)輸入很有限,數(shù)據(jù)量少,耗時(shí)。作為學(xué)習(xí)我們這里用代碼模擬生成數(shù)據(jù)來(lái)進(jìn)行測(cè)試。下面是生成已分類數(shù)據(jù)集的代碼:

生成模擬數(shù)據(jù)的函數(shù)

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

#模擬生成分類數(shù)據(jù)
#目標(biāo)是產(chǎn)生二維坐標(biāo)中的幾堆數(shù)據(jù)集,每堆為一個(gè)類
#函數(shù)邏輯:
#將x軸分段,每個(gè)段設(shè)一個(gè)中心的,所有的中心點(diǎn)用cores存儲(chǔ)。
#設(shè)置每個(gè)數(shù)據(jù)中心點(diǎn)core的類別,由中心點(diǎn)在一定范圍內(nèi)隨機(jī)產(chǎn)生數(shù)據(jù),并將這些數(shù)據(jù)設(shè)為和core一樣的類別
#所以每類的數(shù)據(jù)會(huì)簡(jiǎn)單的被X軸的每段大致分開(kāi)

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

 dataSet = np.zeros((sum(nums),colnum)) #初始化數(shù)據(jù)集,用于存放隨后生成的所有數(shù)據(jù)
 n=0 #記錄生成數(shù)據(jù)的下標(biāo)
 step = 20/clsnum #假定X坐標(biāo)軸只顯示0~20的范圍,step為X軸分段后的段長(zhǎng)
 for j in range(clsnum): #循環(huán)生成各個(gè)類數(shù)據(jù)
 try:
 core = cores[j] #如果cores沒(méi)有給出則,則出錯(cuò),跳至except執(zhí)行
 except IndexError :
 core = np.random.rand(1,3) #中心點(diǎn)為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)生點(diǎn)point(x,y),x以中心點(diǎn)在(core_x - step/2, core_x + step/2)范圍隨機(jī)波動(dòng),y同理。
 row = np.column_stack((point,core[0][2])) #加上類別成為一個(gè)數(shù)據(jù)
 dataSet[n] = row
 n +=1
 i +=1

 j +=1

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

有了數(shù)據(jù)集之后,我們可以用Matplotlib將數(shù)據(jù)可視化,以直觀顯示出來(lái)

數(shù)據(jù)可視化函數(shù)

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

#繪圖展示數(shù)據(jù),每類數(shù)據(jù)點(diǎn)以不同的顏色顯示
def showFigure(dataSet,clsnum):
 fig = plt.figure()
 ax = fig.add_subplot(1,1,1) #界面只需顯示一個(gè)視圖
 ax.set_title('KNN separable data set') #視圖名稱,這里簡(jiǎn)單統(tǒng)一定這個(gè)名稱吧
 plt.xlabel('X') #坐標(biāo)軸名稱
 plt.ylabel('Y')

 colors = ['r','g','b','y','k'] #定義顯示的顏色b為blue,k為black
 for i in range(clsnum):
 idx = np.where(dataSet[:,2] == i) #查詢每類的索引號(hào)
 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()


#測(cè)試一下
#需要結(jié)合模擬生成數(shù)據(jù)的函數(shù)
classnum = 5
nums = np.random.randint(50,100,classnum) #示例 array([56, 69, 60, 92, 95]),每個(gè)數(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ù)
#目標(biāo)是產(chǎn)生二維坐標(biāo)中的幾堆數(shù)據(jù)集,每堆為一個(gè)類
#函數(shù)邏輯:
#將x軸分段,每個(gè)段設(shè)一個(gè)中心的,所有的中心點(diǎn)用cores存儲(chǔ)。
#設(shè)置每個(gè)數(shù)據(jù)中心點(diǎn)core的類別,由中心點(diǎn)在一定范圍內(nèi)隨機(jī)產(chǎn)生數(shù)據(jù),并將這些數(shù)據(jù)設(shè)為和core一樣的類別
#所以每類的數(shù)據(jù)會(huì)簡(jiǎn)單的被X軸的每段大致分開(kāi)

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

 dataSet = np.zeros((sum(nums),colnum)) #初始化數(shù)據(jù)集,用于存放隨后生成的所有數(shù)據(jù)
 n=0 #記錄生成數(shù)據(jù)的下標(biāo)
 step = 20/clsnum #假定X坐標(biāo)軸只顯示0~20的范圍,step為X軸分段后的段長(zhǎng)
 for j in range(clsnum): #循環(huán)生成各個(gè)類數(shù)據(jù)
 try:
 core = cores[j] #如果cores沒(méi)有給出則,則出錯(cuò),跳至except執(zhí)行
 except IndexError :
 core = np.random.rand(1,3) #中心點(diǎn)為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)生點(diǎn)point(x,y),x以中心點(diǎn)在(core_x - step/2, core_x + step/2)范圍隨機(jī)波動(dòng),y同理。
 row = np.column_stack((point,core[0][2])) #加上類別成為一個(gè)數(shù)據(jù)
 dataSet[n] = row
 n +=1
 i +=1

 j +=1

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

#繪圖展示數(shù)據(jù),每類數(shù)據(jù)點(diǎn)以不同的顏色顯示
def showFigure(dataSet,clsnum):
 fig = plt.figure()
 ax = fig.add_subplot(1,1,1) #界面只需顯示一個(gè)視圖
 ax.set_title('KNN separable data set') #視圖名稱,這里簡(jiǎn)單統(tǒng)一定這個(gè)名稱吧
 plt.xlabel('X') #坐標(biāo)軸名稱
 plt.ylabel('Y')

 colors = ['r','g','b','y','k'] #定義顯示的顏色b為blue,k為black
 for i in range(clsnum):
 idx = np.where(dataSet[:,2] == i) #查詢每類的索引號(hào)
 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,先計(jì)算其到已標(biāo)記數(shù)據(jù)集中每個(gè)數(shù)據(jù)的距離
#然后根據(jù)離iData最近的k個(gè)數(shù)據(jù)的分類,出現(xiàn)次數(shù)最多的類別定為iData的分類。

def KNNClassify(labelData,predData,k): #數(shù)據(jù)集包含分類屬性
#labelData 是已經(jīng)標(biāo)記分類的數(shù)據(jù)集
#predData 待預(yù)測(cè)數(shù)據(jù)集
 labShape = labelData.shape
 for i in range(predData.shape[0]): #以predData的每行數(shù)據(jù)進(jìn)行遍歷
 iData = predData[i]
 iDset = np.tile(iData,(labShape[0],1)) #將iData重復(fù),擴(kuò)展成與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 #開(kāi)根號(hào)
 sortedIND = np.argsort(distance) #排序,以序號(hào)返回。
 classCount = { }
 for j in range(k): #計(jì)算距離最近的前k個(gè)標(biāo)記數(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

#測(cè)試
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) #這里為了方便,不在寫(xiě)產(chǎn)生待分類數(shù)據(jù)的代碼,只需用之前的函數(shù)并忽略其類別就好。
predData[...,-1]=0
showFigure(predData,classnum)

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

運(yùn)行程序,結(jié)果如下:

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

 

2.predData的數(shù)據(jù)(未標(biāo)記的數(shù)據(jù)) 

 

3KNNData的數(shù)據(jù)(用KNN算法進(jìn)行分類后的數(shù)據(jù))

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python中使用psutil查看內(nèi)存占用的情況

    python中使用psutil查看內(nèi)存占用的情況

    今天小編就為大家分享一篇python中使用psutil查看內(nèi)存占用的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • pycharm配置Qt?Designer工具的圖文教程

    pycharm配置Qt?Designer工具的圖文教程

    本文主要介紹了pycharm配置Qt?Designer工具的圖文教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 對(duì)pyqt5多線程正確的開(kāi)啟姿勢(shì)詳解

    對(duì)pyqt5多線程正確的開(kāi)啟姿勢(shì)詳解

    今天小編就為大家分享一篇對(duì)pyqt5多線程正確的開(kāi)啟姿勢(shì)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • 啟動(dòng)Atom并運(yùn)行python文件的步驟

    啟動(dòng)Atom并運(yùn)行python文件的步驟

    在本篇文章中我們給大家分享了啟動(dòng)Atom并運(yùn)行python文件的步驟以及具體做法,需要的朋友們參考下。
    2018-11-11
  • 用python爬取豆瓣前一百電影

    用python爬取豆瓣前一百電影

    大家好,本篇文章主要講的是用python爬取豆瓣前一百電影,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 對(duì)pyqt5中QTabWidget的相關(guān)操作詳解

    對(duì)pyqt5中QTabWidget的相關(guān)操作詳解

    今天小編就為大家分享一篇對(duì)pyqt5中QTabWidget的相關(guān)操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Python實(shí)現(xiàn).gif圖片拆分為.png圖片的簡(jiǎn)單示例

    Python實(shí)現(xiàn).gif圖片拆分為.png圖片的簡(jiǎn)單示例

    有時(shí)候需要把GIF圖片分解成一張一張的靜態(tài)圖,jpg或者png格式,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn).gif圖片拆分為.png圖片的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • python計(jì)算時(shí)間差的方法

    python計(jì)算時(shí)間差的方法

    這篇文章主要介紹了python計(jì)算時(shí)間差的方法,實(shí)例分析了Python時(shí)間操作的相關(guān)模塊與技巧,需要的朋友可以參考下
    2015-05-05
  • 利用python對(duì)excel中一列的時(shí)間數(shù)據(jù)更改格式操作

    利用python對(duì)excel中一列的時(shí)間數(shù)據(jù)更改格式操作

    這篇文章主要介紹了利用python對(duì)excel中一列的時(shí)間數(shù)據(jù)更改格式操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • python中defaultdict字典功能特性介紹

    python中defaultdict字典功能特性介紹

    這篇文章主要介紹了python中defaultdict字典功能特性,defaultdict是普通字典dict的一個(gè)子類。通過(guò)collections庫(kù)的defaultdict()方法創(chuàng)建,下面就對(duì)其功能進(jìn)行詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-02-02

最新評(píng)論

黔南| 清苑县| 什邡市| 龙口市| 天镇县| 洞口县| 探索| 迭部县| 建阳市| 马山县| 木兰县| 宁津县| 卢龙县| 庆城县| 景德镇市| 大关县| 同仁县| 沾益县| 五莲县| 湟中县| 普安县| 望谟县| 滨州市| 丰县| 宁德市| 五峰| 盘山县| 广河县| 田阳县| 金昌市| 巴楚县| 吉安市| 大兴区| 宣恩县| 平顶山市| 元江| 阿瓦提县| 丰都县| 四平市| 凤凰县| 克东县|