KNN分類(lèi)算法(K-Nearest-Neighbors Classification),又叫K近鄰算法算法原理非常的簡(jiǎn)單,但是非常的實(shí)用,在機器學(xué)習領(lǐng)域運用十分的廣泛其核心思想是,要確定樣本屬于哪一類(lèi),就去尋找所有訓練樣本中與該測試樣本"距離"最近的前K個(gè)樣本,然后看這K個(gè)樣本大部分屬于哪一類(lèi),那么就認為這個(gè)測試樣本也屬于哪一類(lèi)。簡(jiǎn)單的說(shuō)就是讓最相似的K個(gè)樣本來(lái)投票決定。這里所說(shuō)的距離,一般最常用的就是多維空間的歐式距離。這里的維度指特征維度,即樣本有幾個(gè)特征就屬于幾維示意圖如圖一
上圖中要確定測試樣本綠色屬于藍色還是紅色當K=3時(shí),將以1:2的投票結果分類(lèi)于紅色;而K=5時(shí),將以3:2的投票結果分類(lèi)于藍色這個(gè)也很有哲學(xué)意味,想當年的日心說(shuō),視野決定高度,現在認為是對的東西,說(shuō)不定幾十年后就是荒謬scikit-learn提供了優(yōu)秀的KNN算法支持。
使用Python代碼如下
# -*- coding: utf-8 -*-
import numpy as npfrom sklearn
import neighborsfrom sklearn.metrics
import precision_recall_curvefrom sklearn.metrics
import classification_reportfrom sklearn.cross_validation
import train_test_split
import matplotlib.pyplot as plt
''' 數據讀入 '''
data = []
labels = []
with open("data\\1.txt") as ifile:
for line in ifile:
tokens = line.strip().split(' ')
data.append([float(tk) for tk in tokens[:-1]])
labels.append(tokens[-1])
x = np.array(data)
labels = np.array(labels)
y = np.zeros(labels.shape)
''' 標簽轉換為0/1 '''
y[labels=='fat']=1
''' 拆分訓練數據與測試數據 '''
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2)
''' 創(chuàng )建網(wǎng)格以方便繪制 '''
h = .01
x_min, x_max = x[:, 0].min() - 0.1, x[:, 0].max() + 0.1
y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
''' 訓練KNN分類(lèi)器 '''
clf = neighbors.KNeighborsClassifier(algorithm='kd_tree')
clf.fit(x_train, y_train)
'''測試結果的打印'''
answer = clf.predict(x)
print(x)
print(answer)
print(y)
print(np.mean( answer == y))
'''準確率與召回率'''
precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train))
answer = clf.predict_proba(x)[:,1]
print(classification_report(y, answer, target_names = ['thin', 'fat']))
''' 將整個(gè)測試空間的分類(lèi)結果用不同顏色區分開(kāi)'''
answer = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:,1]
z = answer.reshape(xx.shape)
plt.contourf(xx, yy, z, cmap=plt.cm.Paired, alpha=0.8)
''' 繪制訓練樣本 '''
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=plt.cm.Paired)
plt.xlabel(u'身高')
plt.ylabel(u'體重')
plt.show()