最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

簡介: 我們在這世上,選擇什么就成為什么,人生的豐富多彩,得靠自己成就。你此刻的付出,決定了你未來成為什么樣的人,當(dāng)你改變不了世界,你還可以改變自己。

KNN分類算法的介紹

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

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

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

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

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

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

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

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

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

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

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

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

測試數(shù)據(jù)

測試數(shù)據(jù)的格式仍然和前面使用的身高體重?cái)?shù)據(jù)一致。不過數(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ù)與測試數(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分類器 '''
clf = neighbors.KNeighborsClassifier(algorithm='kd_tree')
clf.fit(x_train, y_train)
 
'''測試結(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']))
 
''' 將整個測試空間的分類結(jié)果用不同顏色區(qū)分開'''
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分類器在眾多分類算法中屬于最簡單的之一,需要注意的地方不多。有這幾點(diǎn)要說明:

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

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

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

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

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

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

相關(guān)文章

  • 基于Python制作圖像完美超分處理工具

    基于Python制作圖像完美超分處理工具

    這篇文章主要和大家分享一個有意思的模型:RealBasicVSR。本文將利用這個模型制作一個圖像超分處理工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • 詳解python持久化文件讀寫

    詳解python持久化文件讀寫

    這篇文章主要介紹了python持久化文件讀寫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • ML神器:sklearn的快速使用及入門

    ML神器:sklearn的快速使用及入門

    這篇文章主要介紹了ML神器:sklearn的快速使用及入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 對python多線程中Lock()與RLock()鎖詳解

    對python多線程中Lock()與RLock()鎖詳解

    今天小編就為大家分享一篇對python多線程中Lock()與RLock()鎖詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 一文帶你探索Python中的eventlet通信機(jī)制

    一文帶你探索Python中的eventlet通信機(jī)制

    這篇文章主要為大家詳細(xì)介紹了Python中的eventlet通信機(jī)制的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們深入了解Python有一定幫助,需要的可以參考一下
    2023-06-06
  • 舉例講解Python中的Null模式與橋接模式編程

    舉例講解Python中的Null模式與橋接模式編程

    這篇文章主要介紹了Python中的Null模式與橋接模式編程,Null模式與橋接模式都屬于Python的設(shè)計(jì)模式編程,需要的朋友可以參考下
    2016-02-02
  • 解決pyinstaller打包發(fā)布后的exe文件打開控制臺閃退的問題

    解決pyinstaller打包發(fā)布后的exe文件打開控制臺閃退的問題

    今天小編就為大家分享一篇解決pyinstaller打包發(fā)布后的exe文件打開控制臺閃退的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 一文詳解Python中subprocess模塊的用法

    一文詳解Python中subprocess模塊的用法

    Python的subprocess模塊是一個非常強(qiáng)大的工具,用于啟動和與外部進(jìn)程進(jìn)行交互,本文將為大家詳細(xì)介紹?subprocess模塊的各個方面,希望對大家有所幫助
    2023-11-11
  • 200行python代碼實(shí)現(xiàn)貪吃蛇游戲

    200行python代碼實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了200行python代碼實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Python socket套接字實(shí)現(xiàn)C/S模式遠(yuǎn)程命令執(zhí)行功能案例

    Python socket套接字實(shí)現(xiàn)C/S模式遠(yuǎn)程命令執(zhí)行功能案例

    這篇文章主要介紹了Python socket套接字實(shí)現(xiàn)C/S模式遠(yuǎn)程命令執(zhí)行功能,涉及Python socket套接字編寫服務(wù)器/客戶機(jī)模式數(shù)據(jù)傳輸相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07

最新評論

双流县| 岳普湖县| 泗洪县| 界首市| 达拉特旗| 任丘市| 米泉市| 虞城县| 大余县| 镇雄县| 吴江市| 县级市| 东山县| 兴文县| 海原县| 凌源市| 仙桃市| 永寿县| 磴口县| 宁乡县| 长治县| 延吉市| 临朐县| 定南县| 双峰县| 威宁| 龙井市| 金门县| 遂昌县| 三明市| 合阳县| 大新县| 洪湖市| 钟山县| 民乐县| 长海县| 灵台县| 威信县| 贵阳市| 靖远县| 筠连县|