Python實現KNN演算法
Python實現KNN演算法
KNN演算法的實際用處很多,主要用於分類階段,是一個基礎的分類演算法。KNN主要基於距離的計算,一般可以在原始的歐氏空間中計算樣本之間的距離。改進版本有:先特徵提取到一個更加鑑別的空間中,然後計算距離;或者先使用metric learning度量學習的技術來獲得一個鑑別的度量空間,然後計算樣本間的馬氏距離。
不管怎麼說,KNN在很多演算法的分類階段都可以用到,我們這裡用python實現KNN。
1. sklearn自帶的KNN
fromsklearn.neighborsimport NearestNeighbors
就可以呼叫最近鄰演算法了。
'''
python實現KNN演算法
'''
#只是返回近鄰點,不分類
from sklearn.neighbors import NearestNeighbors #載入最近鄰演算法
samples = [[0, 0, 0], [0, 0.5, 0], [1, 1, 0.5]];
neigh = NearestNeighbors(n_neighbors=2) #set the number of neighbors
neigh.fit(samples)
print neigh.kneighbors([1, 1, 1]) #return the same number of neighbors
#return two arrays, the first is the calculated distance; the second is the indexs of neighbors, strarting from 0
#實現分類
from sklearn.neighbors import KNeighborsClassifier
knnclf = KNeighborsClassifier(n_neighbors=1) #we set the k=1, while default with k=5
samples = [[0, 0, 0], [0, 0.5, 0], [1, 1, 0.5]] #training samples features
labels = [0, 0, 1] #the labels
knnclf.fit(samples, labels)
print knnclf.predict([1, 1, 1]) #return the classification label, that is, [1]
2. 原始碼實現
我先自己用實現了一遍,然後再看它的原始碼,對比發現對python的使用還有待提高!
自己實現的KNN程式碼:
#編碼實現KNN
from numpy import *
import operator
def creatDataset():
samples = [[0, 0, 0, 0.5], [0, 0.5, 0, 1], [1, 1, 0.5, 0]] #training samples features
samples = mat(samples)
labels = [0, 0, 1] #the labels
return samples, labels
def kNNClassifier(traSamples, lables, k, tstSample):
samNum,feaDim = shape(traSamples); # each line is one sample
minDist = 10
classifiedLabel = labels[0]
for i in range(samNum):
tmpDist = (traSamples[i] - tstSample) * (traSamples[i] - tstSample).T # notice that tmpDist is a matrix here
print tmpDist
if(tmpDist[0][0] < minDist): # since tmpDist is a matrix
minDist = tmpDist
classifiedLabel = labels[i]
return classifiedLabel
tstSample = mat([[1, 1, 1, 0]] )
samples, labels = creatDataset()
print kNNClassifier(samples, labels, 1, tstSample)
原始碼KNN:
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] # the number of samples
# tile function is the same as "replicate" function of MATLAB
# 這個技巧就避免了迴圈語句
diffMat = tile(inX, (dataSetSize, 1)) - dataSet # replicate inX into dataSetSize * 1
sqDiffMat = diffMat**2 # 對應元素平方
sqDistances = sqDiffMat.sum(axis = 1) # 按行求和
distances = sqDistances**0.5 # 開方求距離
sortedDistIndicies = distances.argsort() # argsort函式返回的是陣列值從小到大的索引值
classCount = {}
# 投票
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #排名第i近的樣本的label
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 #get字典的元素,如果不存在key,則為0
# operator.itemgetter(1)按照value排序;也可以用 key = lambda asd:asd[1]
# 排序完,原classCount不變
sortedClassCount = sorted(classCount.iteritems(), # 鍵值對
key = operator.itemgetter(1), reverse = True) #逆序排列
return sortedClassCount[0][0] #輸出第一個,也就是最近鄰
詳細的解釋上面有了,總結:注意使用tile(), **2, **0.5, sum(axis = 1), 陣列的argsort(), 字典的get(), 和sorted用法。
相關文章
- Python底層實現KNNPythonKNN
- KNN演算法推理與實現KNN演算法
- KNN演算法實驗KNN演算法
- 機器學習分享——KNN演算法及numpy實現機器學習KNN演算法
- python機器學習演算法——KNN演算法Python機器學習演算法KNN
- 演算法實踐:KNN分類(day08)演算法KNN
- 演算法金 | 再見!!!KNN演算法KNN
- KNN演算法——分類部分KNN演算法
- 演算法(八):圖解KNN演算法演算法圖解KNN
- python實現FM演算法Python演算法
- FM演算法python實現演算法Python
- python實現冒泡演算法Python演算法
- RSA演算法與Python實現演算法Python
- KNN 演算法-實戰篇-如何識別手寫數字KNN演算法
- educoder 機器學習 --- kNN演算法機器學習KNN演算法
- sklearn調包俠之KNN演算法KNN演算法
- PageRank演算法概述與Python實現演算法Python
- python實現希爾排序演算法Python排序演算法
- 機器學習——KNN近鄰演算法機器學習KNN演算法
- 最基礎的分類演算法(KNN)演算法KNN
- 機器學習筆記(KNN演算法)機器學習筆記KNN演算法
- python實現常用五種排序演算法Python排序演算法
- 模擬退火演算法(1)Python 實現演算法Python
- 蟻群演算法原理及其實現(python)演算法Python
- 機器學習實戰2.1. 超詳細的k-近鄰演算法KNN(附Python程式碼)機器學習演算法KNNPython
- 機器學習-K近鄰演算法-KNN機器學習演算法KNN
- 機器學習經典演算法之KNN機器學習演算法KNN
- 機器學習實踐篇第二篇-KNN演算法學習機器學習KNN演算法
- 機器學習演算法——kNN(k-近鄰演算法)機器學習演算法KNN
- 機器學習演算法-K近鄰(KNN)演算法(三):馬絞痛資料--kNN資料預處理+kNN分類pipeline(程式碼附詳細註釋)機器學習演算法KNN
- CART演算法解密:從原理到Python實現演算法解密Python
- 隨機森林演算法原理與Python實現隨機森林演算法Python
- 用Python實現約瑟夫環演算法Python演算法
- 手寫演算法-python程式碼實現Kmeans演算法Python
- 排序演算法原理總結和Python實現排序演算法Python
- 目標匹配:匈牙利演算法的python實現演算法Python
- [譯]使用 Python 實現接縫裁剪演算法Python演算法
- KNN演算法的資料歸一化--Feature ScalingKNN演算法
- (一)kNNKNN