本篇文章帶給大家的內容是關於Python中KNN演算法(k-近鄰演算法)的詳細介紹(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
KNN演算法是一種資料分類演算法,以距離樣本k個最鄰近資料的類別代表樣本的類別,因此也叫作k-近鄰演算法。 KNN演算法是資料探勘中最簡單的方法之一,大致可分為以下幾個步驟:
#訓練資料:原始資料集中所有資料類別的資料。
測試資料:我們將要拿來測試的資料樣本。
處理資料
我們得到的測試數據,通常和訓練資料是不同維的,這時候就需要我們將測試資料升維到和訓練資料相同,python的numpy中自帶了一個tile()函數可以幫助我們將測試資料升維。
將資料向量化
測試資料升維後,我們為了計算距離樣本點的距離,此時需要將資料向量化,所謂的向量化就很簡單了,即將兩個同維資料相減。
計算歐式距離
歐式距離,即歐幾裡得距離,運用勾股定理即可求出,將升維後的測試資料和訓練資料相減所得的向量組的每一個向量的平方和開方即可得到由距離組成的向量組。
根據距離進行分類
選擇k個距離樣本點距離最小的數據,統計在這k個數據中哪一類數據類別出現的頻率最高,樣本點的資料類別即可確定。
演算法實作:
1.首先我們需要引入numpy以及operator,輸入from numpy import *
和import operator
。
2.接下來我們需要定義一個knn函數,在knn函數中我們需要引入四個參數,分別為k、訓練資料、測試資料和資料類別。
3.接下來我們需要先對資料進行升維操作,需要用到numpy下的tile(a,(b,c))函數,a為要進行升維操作的數據,也就是測試數據,b為要對測試數據升維的行數據,c為要對測試數據升維的列數據。
4.在上一操作中,我們一般需要取得訓練資料的行數和列數,這時需要用到shape()函數,shape()函數傳回的是由訓練資料的行和列組成的元組,我們想要知道訓練資料的行數或列數只需透過數組元素下標的方式來引用。
5.資料的維度相同後,我們要將兩個資料相減得到一個向量,再計算這個向量每個值的平方和的開方即得測試資料到訓練資料的距離,再呼叫argsort()函數將距離依照升序排列,不過此函數傳回的是數組元素的下標。
6.接下來我們為了直覺的看到不同數據類別的出現次數,需要設定一個空字典來存放這些數據,在得到字典後,我們需要將字典依照不同資料類別的出現次數降序排列,進而傳回字典的第一個值即得到測試資料的資料類別。
7.演算法程式碼如下:
from numpy import * import operator def knn(k, test_data, train_data, labels): train_size = train_data.shape[0] #获取训练数据的行数 test_size = tile(test_data, (train_size, 1)) #将测试数据的行升维 minus = test_size-train_data #得到向量 sq_minus = minus**2 sum_sq_minus = sq_minus.sum(axis=1) #得到平方后的每个数组内元素的和 distc = sum_sq_minus**0.5 sort_distc = distc.argsort() #将距离按升序排列 static = {} for i in range(0, k): vote = labels[sort_distc[i]] #获取数据类型 static[vote] = static.get(vote, 0)+1 #统计每个数据类型的出现次数 sort_static = sorted(static.items(), key=operator.itemgetter(1), reverse=True) #将字典中的元素按出现次数降序排列 return sort_static[0][0] #返回出现次数最多的数据类型
8.演算法中需要對字典進行排序,因此需要用到sorted()函數,sorted()函數共有三個參數,分別為items (),operator.itemgetter(),reverse,預設的排序為升序,我們要想依照降序排列需要令第三個參數為True,在這裡我們是依照字典的values進行排序的,因此我們需要輸入sorted(static.items(), key=operator.itemgetter(1), reverse=True)
,operator.itemgetter()函數中的值為1時,是依照字典的values排序,值為0時,是依照字典的key進行排序。
9.排序後存取元素的方式與存取二維陣列元素的方式一致
以上是Python中KNN演算法(k-近鄰演算法)的詳細介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!