中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Python處理KNN分類算法

發布時間:2022-09-07 09:52:22 來源:億速云 閱讀:173 作者:iii 欄目:開發技術

這篇“如何使用Python處理KNN分類算法”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“如何使用Python處理KNN分類算法”文章吧。

KNN分類算法的介紹

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

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

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

KNN示意圖如下所示。

如何使用Python處理KNN分類算法

上圖中要確定測試樣本綠色屬于藍色還是紅色。

顯然,當K=3時,將以1:2的投票結果分類于紅色;而K=5時,將以3:2的投票結果分類于藍色。

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

所以通常KNN的實現會把訓練數據構建成K-D Tree(K-dimensional tree),構建過程很快,甚至不用計算D維歐氏距離,而搜索速度高達O(D*log(N))。

不過當D維度過高,會產生所謂的”維度災難“,最終效率會降低到與暴力法一樣。

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

人們經過長期的實踐發現KNN算法雖然簡單,但能處理大規模的數據分類,尤其適用于樣本分類邊界不規則的情況。最重要的是該算法是很多高級機器學習算法的基礎。

當然,KNN算法也存在一切問題。比如如果訓練數據大部分都屬于某一類,投票算法就有很大問題了。這時候就需要考慮設計每個投票者票的權重了。

測試數據

測試數據的格式仍然和前面使用的身高體重數據一致。不過數據稍微增加了一些

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代碼實現

scikit-learn提供了優秀的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
 
''' 數據讀入 '''
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)
 
''' 創建網格以方便繪制 '''
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分類器 '''
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']))
 
''' 將整個測試空間的分類結果用不同顏色區分開'''
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()

結果分析

輸出結果:
[ 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.]
準確率=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

如何使用Python處理KNN分類算法

KNN分類器在眾多分類算法中屬于最簡單的之一,需要注意的地方不多。有這幾點要說明:

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

2、注意統計準確率時,分類器的score返回的是計算正確的比例,而不是R2。R2一般應用于回歸問題。

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

容易看到,本例的分類邊界,屬于相對復雜,但卻又與距離呈現明顯規則的鋸齒形。

這種邊界線性函數是難以處理的。而KNN算法處理此類邊界問題具有天生的優勢。我們在后續的系列中會看到,這個數據集達到準確率=0.94算是很優秀的結果了。

以上就是關于“如何使用Python處理KNN分類算法”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尖扎县| 习水县| 汝城县| 福安市| 宿松县| 伊宁县| 永泰县| 印江| 沈阳市| 施甸县| 河曲县| 阳谷县| 洛南县| 苗栗县| 左云县| 卓资县| 扶余县| 巴中市| 屯昌县| 乐东| 定日县| 乐至县| 湘潭市| 尚志市| 普格县| 乌鲁木齐县| 施秉县| 康马县| 鸡西市| 尉犁县| 江山市| 扬州市| 台东市| 庐江县| 蓝田县| 兰州市| 子洲县| 唐山市| 天长市| 温州市| 闵行区|