您好,登錄后才能下訂單哦!
怎么實現(xiàn)一個KNN算法,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
教你如何自己實現(xiàn)KNN算法
KNN算法,也稱為K鄰近算法,可以解決回歸和分類問題,但解決分類問題才是它的優(yōu)勢。
KNN算法的本質就是尋找與我們提供的數(shù)據相似的k個樣本,然后判斷這k個樣本的標簽,最后統(tǒng)計每個標簽出現(xiàn)的次數(shù),次數(shù)最多的標簽,就會被當作我們提供的數(shù)據的標簽。
先說說工作流程:
機器學習是基于數(shù)據的,所以要先將實物轉換為向量、矩陣或張量的形式
通過歐式距離計算出測試樣本與其他樣本之間的距離
將距離按照小到大排序,并取前K個值
判斷前K個值相應的標簽,并進行統(tǒng)計
統(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è)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。