python機(jī)器學(xué)習(xí)之KNN分類(lèi)算法-創(chuàng)新互聯(lián)

本文為大家分享了python機(jī)器學(xué)習(xí)之KNN分類(lèi)算法,供大家參考,具體內(nèi)容如下

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到萬(wàn)山網(wǎng)站設(shè)計(jì)與萬(wàn)山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋萬(wàn)山地區(qū)。

1、KNN分類(lèi)算法

KNN分類(lèi)算法(K-Nearest-Neighbors Classification),又叫K近鄰算法,是一個(gè)概念極其簡(jiǎn)單,而分類(lèi)效果又很優(yōu)秀的分類(lèi)算法。

他的核心思想就是,要確定測(cè)試樣本屬于哪一類(lèi),就尋找所有訓(xùn)練樣本中與該測(cè)試樣本“距離”最近的前K個(gè)樣本,然后看這K個(gè)樣本大部分屬于哪一類(lèi),那么就認(rèn)為這個(gè)測(cè)試樣本也屬于哪一類(lèi)。簡(jiǎn)單的說(shuō)就是讓最相似的K個(gè)樣本來(lái)投票決定。

這里所說(shuō)的距離,一般最常用的就是多維空間的歐式距離。這里的維度指特征維度,即樣本有幾個(gè)特征就屬于幾維。

KNN示意圖如下所示。(圖片來(lái)源:百度百科)

python機(jī)器學(xué)習(xí)之KNN分類(lèi)算法

上圖中要確定測(cè)試樣本綠色屬于藍(lán)色還是紅色。

顯然,當(dāng)K=3時(shí),將以1:2的投票結(jié)果分類(lèi)于紅色;而K=5時(shí),將以3:2的投票結(jié)果分類(lèi)于藍(lán)色。

KNN算法簡(jiǎn)單有效,但沒(méi)有優(yōu)化的暴力法效率容易達(dá)到瓶頸。如樣本個(gè)數(shù)為N,特征維度為D的時(shí)候,該算法時(shí)間復(fù)雜度呈O(DN)增長(zhǎng)。

所以通常KNN的實(shí)現(xiàn)會(huì)把訓(xùn)練數(shù)據(jù)構(gòu)建成K-D Tree(K-dimensional tree),構(gòu)建過(guò)程很快,甚至不用計(jì)算D維歐氏距離,而搜索速度高達(dá)O(D*log(N))。

不過(guò)當(dāng)D維度過(guò)高,會(huì)產(chǎn)生所謂的”維度災(zāi)難“,最終效率會(huì)降低到與暴力法一樣。

因此通常D>20以后,最好使用更高效率的Ball-Tree,其時(shí)間復(fù)雜度為O(D*log(N))。

人們經(jīng)過(guò)長(zhǎng)期的實(shí)踐發(fā)現(xiàn)KNN算法雖然簡(jiǎn)單,但能處理大規(guī)模的數(shù)據(jù)分類(lèi),尤其適用于樣本分類(lèi)邊界不規(guī)則的情況。最重要的是該算法是很多高級(jí)機(jī)器學(xué)習(xí)算法的基礎(chǔ)。

當(dāng)然,KNN算法也存在一切問(wèn)題。比如如果訓(xùn)練數(shù)據(jù)大部分都屬于某一類(lèi),投票算法就有很大問(wèn)題了。這時(shí)候就需要考慮設(shè)計(jì)每個(gè)投票者票的權(quán)重了。

2、測(cè)試數(shù)據(jù)

測(cè)試數(shù)據(jù)的格式仍然和前面使用的身高體重?cái)?shù)據(jù)一致。不過(guò)數(shù)據(jù)增加了一些:

1.5 40 thin
1.5 50 fat
1.5 60 fat
1.6 40 thin
1.6 50 thin
1.6 60 fat
1.6 70 fat
1.7 50 thin
1.7 60 thin
1.7 70 fat
1.7 80 fat
1.8 60 thin
1.8 70 thin
1.8 80 fat
1.8 90 fat
1.9 80 thin
1.9 90 fat


3、Python代碼

scikit-learn提供了優(yōu)秀的KNN算法支持。使用Python代碼如下:

# -*- coding: utf-8 -*-
import numpy as np
from sklearn import neighbors
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import classification_report
from sklearn.cross_validation import train_test_split
import matplotlib.pyplot as plt
 
''' 數(shù)據(jù)讀入 '''
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)
 
''' 標(biāo)簽轉(zhuǎn)換為0/1 '''
y[labels=='fat']=1
 
''' 拆分訓(xùn)練數(shù)據(jù)與測(cè)試數(shù)據(jù) '''
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))
 
''' 訓(xùn)練KNN分類(lèi)器 '''
clf = neighbors.KNeighborsClassifier(algorithm='kd_tree')
clf.fit(x_train, y_train)
 
'''測(cè)試結(jié)果的打印'''
answer = clf.predict(x)
print(x)
print(answer)
print(y)
print(np.mean( answer == y))
 
'''準(zhǔn)確率與召回率'''
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è)測(cè)試空間的分類(lèi)結(jié)果用不同顏色區(qū)分開(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)
 
''' 繪制訓(xùn)練樣本 '''
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=plt.cm.Paired)
plt.xlabel(u'身高')
plt.ylabel(u'體重')
plt.show()

當(dāng)前題目:python機(jī)器學(xué)習(xí)之KNN分類(lèi)算法-創(chuàng)新互聯(lián)
文章路徑:http://bm7419.com/article48/gjohp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站內(nèi)鏈標(biāo)簽優(yōu)化、做網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司