欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python處理KNN分類(lèi)算法的實(shí)現(xiàn)代碼

 更新時(shí)間:2022年09月06日 14:29:37   作者:阿里機(jī)器智能  
KNN分類(lèi)算法(K-Nearest-Neighbors?Classification),又叫K近鄰算法,是一個(gè)概念極其簡(jiǎn)單,而分類(lèi)效果又很優(yōu)秀的分類(lèi)算法,這篇文章主要介紹了使用Python處理KNN分類(lèi)算法,需要的朋友可以參考下

簡(jiǎn)介: 我們?cè)谶@世上,選擇什么就成為什么,人生的豐富多彩,得靠自己成就。你此刻的付出,決定了你未來(lái)成為什么樣的人,當(dāng)你改變不了世界,你還可以改變自己。

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)源:百度百科)

上圖中要確定測(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)重了。

測(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

Python代碼實(shí)現(xiàn)

scikit-learn提供了優(yōu)秀的KNN算法支持。

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()

結(jié)果分析

輸出結(jié)果:
[ 0.  0.  1.  0.  0.  1.  1.  0.  0.  1.  1.  0.  0.  1.  1.  0.  1.]
[ 0.  1.  1.  0.  0.  1.  1.  0.  0.  1.  1.  0.  0.  1.  1.  0.  1.]
準(zhǔn)確率=0.94, score=0.94
             precision    recall  f1-score   support
       thin      0.89      1.00      0.94         8
        fat       1.00      0.89      0.94         9
avg / total       0.95      0.94      0.94        17

KNN分類(lèi)器在眾多分類(lèi)算法中屬于最簡(jiǎn)單的之一,需要注意的地方不多。有這幾點(diǎn)要說(shuō)明:

1、KNeighborsClassifier可以設(shè)置3種算法:‘brute',‘kd_tree',‘ball_tree'。如果不知道用哪個(gè)好,設(shè)置‘auto'讓KNeighborsClassifier自己根據(jù)輸入去決定。

2、注意統(tǒng)計(jì)準(zhǔn)確率時(shí),分類(lèi)器的score返回的是計(jì)算正確的比例,而不是R2。R2一般應(yīng)用于回歸問(wèn)題。

3、本例先根據(jù)樣本中身高體重的最大最小值,生成了一個(gè)密集網(wǎng)格(步長(zhǎng)h=0.01),然后將網(wǎng)格中的每一個(gè)點(diǎn)都當(dāng)成測(cè)試樣本去測(cè)試,最后使用contourf函數(shù),使用不同的顏色標(biāo)注出了胖、廋兩類(lèi)。

容易看到,本例的分類(lèi)邊界,屬于相對(duì)復(fù)雜,但卻又與距離呈現(xiàn)明顯規(guī)則的鋸齒形。

這種邊界線(xiàn)性函數(shù)是難以處理的。而KNN算法處理此類(lèi)邊界問(wèn)題具有天生的優(yōu)勢(shì)。我們?cè)诤罄m(xù)的系列中會(huì)看到,這個(gè)數(shù)據(jù)集達(dá)到準(zhǔn)確率=0.94算是很優(yōu)秀的結(jié)果了。

到此這篇關(guān)于使用Python處理KNN分類(lèi)算法的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)Python KNN分類(lèi)算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python聚類(lèi)算法解決方案(rest接口/mpp數(shù)據(jù)庫(kù)/json數(shù)據(jù)/下載圖片及數(shù)據(jù))

    python聚類(lèi)算法解決方案(rest接口/mpp數(shù)據(jù)庫(kù)/json數(shù)據(jù)/下載圖片及數(shù)據(jù))

    這篇文章主要介紹了python聚類(lèi)算法解決方案(rest接口/mpp數(shù)據(jù)庫(kù)/json數(shù)據(jù)/下載圖片及數(shù)據(jù)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • tensorflow 獲取變量&打印權(quán)值的實(shí)例講解

    tensorflow 獲取變量&打印權(quán)值的實(shí)例講解

    今天小編就為大家分享一篇tensorflow 獲取變量&打印權(quán)值的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python greenlet實(shí)現(xiàn)原理和使用示例

    Python greenlet實(shí)現(xiàn)原理和使用示例

    這篇文章主要介紹了Python greenlet實(shí)現(xiàn)原理和使用示例,greenlet是Python中的一個(gè)并行處理庫(kù),需要的朋友可以參考下
    2014-09-09
  • python pyecharts庫(kù)的用法大全

    python pyecharts庫(kù)的用法大全

    這篇文章主要介紹了python pyecharts庫(kù)的用法大全,pyecharts 是一個(gè)用于生成 Echarts 圖表的類(lèi)庫(kù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-04-04
  • 理解python中裝飾器的作用

    理解python中裝飾器的作用

    python裝飾器就是用于拓展原來(lái)函數(shù)功能的一種函數(shù),這個(gè)函數(shù)的特殊之處在于它的返回值也是一個(gè)函數(shù),使用python裝飾器的好處就是在不用更改原函數(shù)的代碼前提下給函數(shù)增加新的功能
    2021-07-07
  • Python中反轉(zhuǎn)二維數(shù)組的行和列問(wèn)題

    Python中反轉(zhuǎn)二維數(shù)組的行和列問(wèn)題

    這篇文章主要介紹了Python中反轉(zhuǎn)二維數(shù)組的行和列問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • python中使用np.delete()的實(shí)例方法

    python中使用np.delete()的實(shí)例方法

    在本篇文章里小編給大家整理的是一篇關(guān)于python中使用np.delete()的實(shí)例方法,對(duì)此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • Pycharm配置PyQt5環(huán)境的教程

    Pycharm配置PyQt5環(huán)境的教程

    這篇文章主要介紹了Pycharm配置PyQt5環(huán)境的教程,本文通過(guò)圖文實(shí)例詳解給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Python在字符串中處理html和xml的方法

    Python在字符串中處理html和xml的方法

    這篇文章主要介紹了Python在字符串中處理html和xml的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Python實(shí)現(xiàn)簡(jiǎn)易的限流器介紹

    Python實(shí)現(xiàn)簡(jiǎn)易的限流器介紹

    大家好,本篇文章主要講的是Python實(shí)現(xiàn)簡(jiǎn)易的限流器介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下
    2022-01-01

最新評(píng)論