您好,登錄后才能下訂單哦!
怎么實現一個KNN算法,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
教你如何自己實現KNN算法
KNN算法,也稱為K鄰近算法,可以解決回歸和分類問題,但解決分類問題才是它的優勢。
KNN算法的本質就是尋找與我們提供的數據相似的k個樣本,然后判斷這k個樣本的標簽,最后統計每個標簽出現的次數,次數最多的標簽,就會被當作我們提供的數據的標簽。
先說說工作流程:
機器學習是基于數據的,所以要先將實物轉換為向量、矩陣或張量的形式
通過歐式距離計算出測試樣本與其他樣本之間的距離
將距離按照小到大排序,并取前K個值
判斷前K個值相應的標簽,并進行統計
統計最多的標簽即為預測結果
現在我們來動手實現一下
先導入所有需要導入的庫或模塊
# 導入sklearn自帶的數據集from sklearn import datasets# 導入計數器,用于統計標簽出現的次數from collections import Counter# 用于分割數據集from sklearn.model_selection import train_test_split# 用于計算歐式距離import numpy as np
其次,導入iris數據集,存儲樣本特征和標簽
data = datasets.load_iris()# 將樣本特征存儲到XX = data['data']# 將樣本標簽存儲到YY = data['target']
然后為了后期評估模型,這里將數據集分為訓練集和測試集
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,random_state=2000)
設置random_state為固定值,這樣每次的運行結果就會一樣,幫助我們判斷過程出現的bug
再次,寫一個計算距離的函數eus_dis
def eus_dis(instance1, instance2): '''計算兩個樣本之間的距離 instance1:array型 instance2:array型 ''' distance = np.sqrt(sum((instance1-instance2)**2)) return distance
接著,真正的開始實現KNN算法
def KnnClassify(X,Y,test,k): '''實現KNN算法 X:特征訓練集-->array型 Y:標簽訓練集-->array型 test:特征測試集-->array型 k:鄰近值-->int ''' # 計算樣本之間的距離 distances = [eus_dis(x, test) for x in X] # 按照從小到大排序,并取前K個值,返回下標 kneighbors = np.argsort(distances)[:k] # 統計每個標簽出現的次數 count = Counter(Y[kneighbors]) # 返回出現次數最多的標簽 return count.most_common()[0][0]
最后我們來進行測試,觀察其準確率
# 存儲模型對特征測試集的預測結果predirect = [KnnClassify(X_train,Y_train,test,5) for test in X_test]# 計算預測結果與實際結果相等的個數count = np.count_nonzero((predirect==Y_test)==True)print("該模型的預測準確率為:%.3f" % (count/len(X_test)))
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。