溫馨提示×

溫馨提示×

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

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

怎么實現(xiàn)一個KNN算法

發(fā)布時間:2021-06-21 18:23:25 來源:億速云 閱讀:155 作者:Leah 欄目:大數(shù)據

怎么實現(xiàn)一個KNN算法,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

教你如何自己實現(xiàn)KNN算法

KNN算法,也稱為K鄰近算法,可以解決回歸和分類問題,但解決分類問題才是它的優(yōu)勢。

KNN算法的本質就是尋找與我們提供的數(shù)據相似的k個樣本,然后判斷這k個樣本的標簽,最后統(tǒng)計每個標簽出現(xiàn)的次數(shù),次數(shù)最多的標簽,就會被當作我們提供的數(shù)據的標簽。

先說說工作流程:

  1. 機器學習是基于數(shù)據的,所以要先將實物轉換為向量、矩陣或張量的形式

  2. 通過歐式距離計算出測試樣本與其他樣本之間的距離

  3. 將距離按照小到大排序,并取前K個值

  4. 判斷前K個值相應的標簽,并進行統(tǒng)計

  5. 統(tǒng)計最多的標簽即為預測結果

現(xiàn)在我們來動手實現(xiàn)一下

先導入所有需要導入的庫或模塊

# 導入sklearn自帶的數(shù)據集from sklearn import datasets# 導入計數(shù)器,用于統(tǒng)計標簽出現(xiàn)的次數(shù)from collections import Counter# 用于分割數(shù)據集from sklearn.model_selection import train_test_split# 用于計算歐式距離import numpy as np

其次,導入iris數(shù)據集,存儲樣本特征和標簽

data = datasets.load_iris()# 將樣本特征存儲到XX = data['data']# 將樣本標簽存儲到YY = data['target']

然后為了后期評估模型,這里將數(shù)據集分為訓練集和測試集

X_train,X_test,Y_train,Y_test = train_test_split(X,Y,random_state=2000)

設置random_state為固定值,這樣每次的運行結果就會一樣,幫助我們判斷過程出現(xiàn)的bug

再次,寫一個計算距離的函數(shù)eus_dis

def eus_dis(instance1, instance2):    '''計算兩個樣本之間的距離      instance1:array型      instance2:array型    '''    distance = np.sqrt(sum((instance1-instance2)**2))    return distance

接著,真正的開始實現(xiàn)KNN算法

def KnnClassify(X,Y,test,k):    '''實現(xiàn)KNN算法        X:特征訓練集-->array型        Y:標簽訓練集-->array型        test:特征測試集-->array型        k:鄰近值-->int    '''    # 計算樣本之間的距離    distances = [eus_dis(x, test) for x in X]    # 按照從小到大排序,并取前K個值,返回下標    kneighbors = np.argsort(distances)[:k]    # 統(tǒng)計每個標簽出現(xiàn)的次數(shù)    count = Counter(Y[kneighbors])    # 返回出現(xiàn)次數(shù)最多的標簽    return count.most_common()[0][0]

最后我們來進行測試,觀察其準確率

# 存儲模型對特征測試集的預測結果predirect = [KnnClassify(X_train,Y_train,test,5) for test in X_test]# 計算預測結果與實際結果相等的個數(shù)count = np.count_nonzero((predirect==Y_test)==True)print("該模型的預測準確率為:%.3f" % (count/len(X_test)))

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

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

AI