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 屬於懶...