機器學習 k鄰近演算法 KNN

2021-09-29 16:46:06 字數 4142 閱讀 3192

title: 機器學習:k鄰近演算法(knn)

date: 2019-11-16 20:20:41

mathjax: true

categories:

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-ae8zaru7-1573908679258)( 1573907207887.png)]

現在我們得到了樣本集中所有電影與未知電影的距離,按照距離遞增排序,可以找到k個距

離最近的電影。假定k=3,則三個最靠近的電影依次是he』s not really into dudes、beautiful woman

和california man。k-近鄰演算法按照距離最近的三部電影的型別,決定未知電影的型別,而這三部

電影全是愛情片,因此我們判定未知電影是愛情片。

她希望:

工作日與魅力一般的人約會

週末與極具魅力的人約會

不喜歡的人則直接排除掉

現在她收集到了一些約會**未曾記錄的資料資訊,這更有助於匹配物件的歸類。

開發流程

分析資料:使用 matplotlib 畫二維散點圖

訓練演算法:此步驟不適用於 k-近鄰演算法

測試演算法:使用海倫提供的部分資料作為測試樣本。

測試樣本和非測試樣本的區別在於:

測試樣本是已經完成分類的資料,如果**分類與實際類別不同,則標記為乙個錯誤。

使用演算法:產生簡單的命令列程式,然後海倫可以輸入一些特徵資料以判斷對方是否為自己喜歡的型別。

開啟檔案:

def

file2matrix

(filename)

: fr =

open

(filename)

arrayolines = fr.readlines(

) numberoflines =

len(arrayolines)

#得到檔案行數

returnmat = zeros(

(numberoflines,3)

)#建立乙個n行3列資料

classlabelvector =

index =

0for line in arrayolines:

line = line.strip(

)#去除兩邊空格

listfromline = line.split(

'\t'

) returnmat[index,:]

= listfromline[0:

3]int(listfromline[-1

]))#結果集

index +=

1return returnmat,classlabelvector

注意:由於numpy庫提供的陣列操作並不支援python自帶的陣列型別,因此在編寫**時要注意不要使用錯誤的陣列型別

畫出散點圖:

import matplotlib

import matplotlib.pyplot as plt

fig = plt.figure(

)ax = fig.add_subplot(

111)

#1*1網格

ax.scatter(datingdatamat[:,

1],datingdatamat[:,

2],15.0

*array(datinglabels)

,15.0

*array(datinglabels)

)#畫出第二列第三列影象

plt.show(

)

結果:

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-ljvydtco-1573908679267)( 11162037.png)]

資料歸一化處理:

def

autonorm

(dataset)

: minvals = dataset.

min(0)

#最大值,每列的

maxvals = dataset.

max(0)

ranges = maxvals-minvals#差值

normdataset = zeros(shape(dataset)

)#構建乙個和dataset類似的0矩陣

m = dataset.shape[0]

normdataset = dataset - tile(minvals,

(m,1))

normdataset = normdataset/tile(ranges,

(m,1))

return normdataset,ranges,minvals

進行資料分析:

def

datingclasstest()

: horation =

0.10

datingdatamat,datinglabels = file2matrix(

'./2.knn/datingtestset2.txt'

) normmat,ranges,minvals = autonorm(datingdatamat)

m = normmat.shape[0]

numtestvecs =

int(m*horation)

errorcount =

0.0for i in

range

(numtestvecs)

: classifierresult = classify0(normmat[i,:]

,normmat[numtestvecs:m,:]

,datinglabels[numtestvecs:m],5

)print

("the classifier came back with: %d ,the real answer is: %d"

%(classifierresult,datinglabels[i]))

if(classifierresult!= datinglabels[i]):

errorcount+=1;

print

("the total error rate is:%f"

%(errorcount/

float

(numtestvecs)

))

結果:

判定函式:

def

classifyperson()

: resultlist =

['not at all'

,'in small doses'

,'in large doses'

] percenttats =

float

(input

("percentage of time spent playing video games?"))

ffmiles =

float

(input

("frequent flier miles earned per year?"))

icecream =

float

(input

("liters of ice cream consumed per year?"))

datingdataamat,datinglabels = file2matrix(

'./2.knn/datingtestset2.txt'

) normmat,ranges,minvals = autonorm(datingdatamat)

#資料歸一化

inarr = array(

[ffmiles,percenttats,icecream]

) classifierresult = classify0(

(inarr-minvals)

/ranges,normmat,datinglabels,3)

print

('you will probably like this person:'

,resultlist[classifierresult-1]

)

執行:

機器學習 K 鄰近演算法 KNN

k 鄰近演算法 有監督演算法 演算法工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每乙個特徵與樣本集中資料對應的特徵進行比較,然後演算法提供樣本集中特徵最相似資料 最鄰近 的分類標...

機器學習鄰近演算法(KNN)

臨近演算法 臨近演算法 knn 是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表,knn方法既可以做分類,也可以做回歸。knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬...

機器學習 KNN鄰近演算法

1 knn 演算法概述 cover和hart在1968年提出了最初的鄰近演算法。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。knn是一種分類 classification 演算法,它輸入基於例項的學習 instance based learning 屬於懶...