溫馨提示×

溫馨提示×

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

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

基于python如何實現KNN分類算法

發(fā)布時間:2020-08-01 09:35:59 來源:億速云 閱讀:151 作者:小豬 欄目:開發(fā)技術

這篇文章主要為大家展示了基于python如何實現KNN分類算法,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

kNN算法的核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數屬于某一個類別,則該樣本也屬于這個類別,并具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 kNN方法在類別決策時,只與極少量的相鄰樣本有關。由于kNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對于類域的交叉或重疊較多的待分樣本集來說,kNN方法較其他方法更為適合。

通俗簡單的說,就是將這個樣本進行分類,怎么分類,就是用該樣本的特征與空間中其他樣本做計算距離,當出現大多數距離偏向于某個樣本類時,我們認為該樣本屬于這個類別。

舉例說明:淘寶商品是按類進行售賣的,對于零食類商品a,b,c,價格與銷量分別對應(19,1000),(89,500),(9.9,3000)對與電器類商品d,e,f,價格與銷量分別為(1000,10),(499,30),(999,100),對于一個未知的產品(300,80),我們使用kNN算法進行求解,我們假設k=3(k的值要時情況而定,沒有確定的),分別求出未知產品到這六個點的歐式距離,即:sqrt((x1-y1)**2+(x2-y2)**2)計算出結果進行倒序排序,我們得出前三的點分別為:e,b,f。所以我們認為未知產品是電器類產品,當然實際生活中不能僅僅有價格,銷量這兩個二維數據,可能是n維數據,歐式距離的公式也是一樣的,現實中也不僅僅有這兩個分類,kNN提供了一種簡單的解決思路。其中a,b,c,d,e,f稱為訓練數據,未知數據稱為測試數據。

還有在進行計算時有時需要格式化一下數據,例如對于c產品與未知產品,明顯計算銷量所產生的數據要遠大于價格,為了減小這個帶來的誤差,可以使用以下:

參考鏈接

def normData(dataSet):
 maxVals = dataSet.max(axis=0)#按列獲取最大值,并返回數組
 minVals = dataSet.min(axis=0)
 ranges = maxVals - minVals
 retData = (dataSet - minVals) / ranges
 return retData, ranges, minVals

代碼

#!/user/bin/env python
#-*- coding:utf-8 -*-
import numpy as np
import operator as opt

def normData(dataSet):#標準化訓練集數據
 maxVals = dataSet.max(axis=0)
 minVals = dataSet.min(axis=0)
 ranges = maxVals - minVals
 retData = (dataSet - minVals) / ranges
 return retData, ranges, minVals

def kNN(dataSet, labels, testData, k):
 distSquareMat = (dataSet - testData) ** 2 # 計算差值的平方
 distSquareSums = distSquareMat.sum(axis=1) # 求每一行的差值平方和,axis=0則按列計算
 distances = distSquareSums ** 0.5 # 開根號,得出每個樣本到測試點的距離
 sortedIndices = distances.argsort() # 排序,得到排序后的下標
 indices = sortedIndices[:k] # 取最小的k個
 labelCount = {} # 存儲每個label的出現次數,出現次數最多的就是我們要選擇的類別
 for i in indices:
 label = labels[i]
 labelCount[label] = labelCount.get(label, 0) + 1 # 次數加一,使用字典的get方法,第一次出現時默認值是0
 sortedCount = sorted(labelCount.items(), key=opt.itemgetter(1), reverse=True) # 對label出現的次數從大到小進行排序
 return sortedCount[0][0] # 返回出現次數最大的label

if __name__ == "__main__":#測試程序
 dataSet = np.array([[2, 3], [6, 8]])#訓練集
 normDataSet, ranges, minVals = normData(dataSet)
 labels = ['a', 'b']#訓練集分別為a和b類
 testData = np.array([3.9, 5.5])#測試數據
 normTestData = (testData - minVals) / ranges#同樣需要將測試數據標準化
 result = kNN(normDataSet, labels, normTestData, 1)#k=1
 print(result)

以上就是關于基于python如何實現KNN分類算法的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

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

AI