knn演算法又稱為k近鄰分類(k-nearest neighbor classification)演算法。
演算法原理是,從訓練集中找到和新資料距離最接近的k條記錄,然後根據這k條記錄的分類來決定新資料的類別。所以knn的關鍵是,訓練集與測試集、距離或相似的衡量、k的大小及分類決策規則。一旦他們確定了,則結果就確定了。常用的距離度量公式是歐氏距離,k值的選擇反映了對近似誤差與估計誤差之間的權衡,k值的選擇會對結果產生重大的影響,通常由交叉驗證選擇最優的k值。
knn演算法的優點:
簡單,易於理解,易於實現,無需估計引數,無需訓練; 適合對稀有事件進行分類;特別適合於多分類問題, knn比svm的表現要好
缺點:懶惰演算法,對測試樣本分類時的計算量大,記憶體開銷大(我自己夠用)
#-*- coding: utf-8 -*-
from numpy import *
import operator
'''從檔案中讀取資料,將文字記錄轉換為矩陣,提取其中特徵和類標'''
deffilematrix
(filename):
fr=open(filename)
arrayolines=fr.readlines()
numberoflines=len(arrayolines) #得到檔案行數
returnmat=zeros((numberoflines,7)) #建立以零填充的numberoflines*7的numpy矩陣
classlabelvector=
index=0
for line in arrayolines: #獲取資料,獲取特徵矩陣
line=line.strip()
##文字分割
listfromline=line.split('\t')
# print(listfromline[1:8])
##獲取x
returnmat[index, : ]=listfromline[1:8]
##獲取標籤y
index+=1
return returnmat,classlabelvector #返回特徵矩陣和類標集合
'''歸一化數字特徵值到0-1範圍,防止特大值與特小值的影響'''
'''輸入為特徵值矩陣'''
defautonorm
(dataset):
minvals=dataset.min(0)
maxvals=dataset.max(0)
ranges=maxvals-minvals
normdataset=zeros(shape(dataset))
m=dataset.shape[0]
normdataset=dataset-tile(minvals,(m,1))
normdataset=normdataset/tile(ranges,(m,1))
return normdataset, ranges, minvals
defclassify
(sample,dataset,labels,k):
datasetsize=dataset.shape[0] #資料集行數即資料集記錄數
'''距離計算'''
diffmat=tile(sample,(datasetsize,1))-dataset #樣本與原先所有樣本的差值矩陣
sqdiffmat=diffmat**2
#差值矩陣平方
sqdistances=sqdiffmat.sum(axis=1) #計算每一行上元素的和
distances=sqdistances**0.5
#開方 sorteddistindicies=distances.argsort() #按distances中元素進行公升序排序後得到的對應下標的列表(索引值)
'''選擇距離最小的k個點'''
classcount={}
for i in range(k):
voteilabel=labels[sorteddistindicies[i]]
classcount[voteilabel]=classcount.get(voteilabel,0)+1
'''從大到小排序'''
sortedclasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=true)
return sortedclasscount[0][0]
defclasstest
(): horatio=0.20
#測試樣例資料比例
datingdatamat,datinglabels=filematrix('user_info_and_topic_5topicand50word.txt')
#將測試集資料標準化,轉化為0-1之間
normmat, ranges, minvals=autonorm(datingdatamat)
##樣本總數目
m =normmat.shape[0]
##測試集的數目
numtestvecs=int(m*horatio)
precisioncount=0.0
##執行時,設定k的數目來調解演算法的準確率
k=35
##對測試集乙個乙個與訓練集算距離
for i in range(numtestvecs):
classifierresult=classify(normmat[i, : ],normmat[numtestvecs:m, : ], datinglabels[numtestvecs:m],k)
print("the classifier came back with: %s, the real answer is: %s" % (classifierresult, datinglabels[i]))
##如果真實類別的和**的類別相同,則加1
如圖所示,為以上演算法的資料格式,但是在運用是需要將資料的第一行刪除,只保留數字。並將其轉化為.txt文件,注意最好是utf-8的形式。以下**中的,其中7表示age,user_province,topic1……..topic5七個變數
returnmat=zeros((numberoflines,7)) #建立以零填充的numberoflines*7
以下**是獲得變數x的
##獲取x
returnmat[index, : ]=listfromline[1:8]
'''從檔案中讀取資料,將文字記錄轉換為矩陣,提取其中特徵和類標'''
deffilematrix
(filename):
fr=open(filename)
arrayolines=fr.readlines()
numberoflines=len(arrayolines) #得到檔案行數
returnmat=zeros((numberoflines,7)) #建立以零填充的numberoflines*7的numpy矩陣
classlabelvector=
index=0
for line in arrayolines: #獲取資料,獲取特徵矩陣
line=line.strip()
##文字分割
listfromline=line.split('\t')
# print(listfromline[1:8])
##獲取x
returnmat[index, : ]=listfromline[1:8]
##獲取標籤y
index+=1
return returnmat,classlabelvector #返回特徵矩陣和類標集合
如下圖所示,為knn演算法,針對我的資料跑出的精度,以及**的標籤,通過調節k值來調解**的精度。 KNN原理及python實現 kd樹
覺得自己完全看懂和做出來是兩回事,希望自己可以堅持將機器學習演算法基本都復現出來,並有時間進行時間空間複雜度的優化,用matlab梳理完思路後有時間再用python寫一遍,畢竟我是乙個厲害的小女子哈哈哈。如果你閱讀我的文章有什麼疑問,或是任何學術討論,歡迎和我交流 ianqi1994 163.com...
KNN(一) 簡單KNN原理及實現
原文 1.knn演算法介紹 鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法可以說是整個資料探勘分類技術中最簡單的方法了。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用她最接近的k個鄰居來代表。knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最...
KNN(一) 簡單KNN原理及實現
原文 1.knn演算法介紹 鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法可以說是整個資料探勘分類技術中最簡單的方法了。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用她最接近的k個鄰居來代表。knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最...