
把近朱者赤,近墨者黑這一思想運用到機器學習中會產生什么?當然是KNN最鄰近算法啦!KNN(全稱K-Nearest Neighbor)最鄰近分類算法是數據挖掘分類算法中最簡單的算法之一,白話解釋一下就是:由你的鄰居來推斷出你的類別。那么KNN算法的原理是什么,如何實現?一起與小編來看下面的內容吧。
一、KNN最鄰近算法概念
KNN最鄰近算法,是著名的模式識別統計學方法之一,在機器學習分類算法中占有很高的地位。KNN最鄰近算法在理論上比較成熟,不僅是最簡單的機器學習算法之一,而且也是基于實例的學習方法中最基本的,最好的文本分類算法之一。
KNN最鄰近算法基本做法是:給定測試實例,基于某種距離度量找出訓練集中與其最靠近的k個實例點,然后基于這k個最近鄰的信息來進行預測。
KNN最鄰近算法不具有顯式的學習過程,事實上,它是懶惰學習(lazy learning)的著名代表,此類學習技術在訓練階段僅僅是把樣本保存起來,訓練時間開銷為零,待收到測試樣本后再進行處理。
二、KNN最鄰近算法三要素
KNN最鄰近算法三要素為:距離度量、k值的選擇及分類決策規則。根據選擇的距離度量(如曼哈頓距離或歐氏距離),可計算測試實例與訓練集中的每個實例點的距離,根據k值選擇k個最近鄰點,最后根據分類決策規則將測試實例分類。
1.距離度量
特征空間中的兩個實例點的距離是兩個實例點相似程度的反映。K近鄰法的特征空間一般是n維實數向量空間Rn。使用的距離是歐氏距離,但也可以是其他距離,如更一般的Lp距離或Minkowski距離。
這里p≥1.
當p=1時,稱為曼哈頓距離(Manhattan distance),即
當p=2時,稱為歐氏距離(Euclidean distance),即
2.k值的選擇
k值的選擇會對KNN最鄰近算法的結果產生重大影響。在應用中,k值一般取一個比較小的數值,通常采用交叉驗證法來選取最優的k值。
3.分類決策規則
KNN最鄰近算法中的分類決策規則通常是多數表決,即由輸入實例的k個鄰近的訓練實例中的多數類,決定輸入實例的類。
三、KNN最鄰近算法優缺點
1.優點
①簡單,易于理解,易于實現,無需參數估計,無需訓練;
②精度高,對異常值不敏感(個別噪音數據對結果的影響不是很大);
③適合對稀有事件進行分類;
④特別適合于多分類問題(multi-modal,對象具有多個類別標簽),KNN要比SVM表現要好.
2.缺點
①對測試樣本分類時的計算量大,空間開銷大,因為對每一個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本;
②可解釋性差,無法給出決策樹那樣的規則;
③最大的缺點是當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本占多數。該算法只計算“最近的”鄰居樣本,某一類的樣本數量很大,那么或者這類樣本并不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量并不能影響運行結果??梢圆捎脵嘀档姆椒?和該樣本距離小的鄰居權值大)來改進;
④消極學習方法。
四、KNN算法實現
主要有以下三個步驟:
1. 算距離:給定待分類樣本,計算它與已分類樣本中的每個樣本的距離;
2. 找鄰居:圈定與待分類樣本距離最近的K個已分類樣本,作為待分類樣本的近鄰;
3. 做分類:根據這K個近鄰中的大部分樣本所屬的類別來決定待分類樣本該屬于哪個分類;
python示例
import math import csv import operator import random import numpy as np from sklearn.datasets import make_blobs #Python version 3.6.5 # 生成樣本數據集 samples(樣本數量) features(特征向量的維度) centers(類別個數) def createDataSet(samples=100, features=2, centers=2): return make_blobs(n_samples=samples, n_features=features, centers=centers, cluster_std=1.0, random_state=8) # 加載鳶尾花卉數據集 filename(數據集文件存放路徑) def loadIrisDataset(filename): with open(filename, 'rt') as csvfile: lines = csv.reader(csvfile) dataset = list(lines) for x in range(len(dataset)): for y in range(4): dataset[x][y] = float(dataset[x][y]) return dataset # 拆分數據集 dataset(要拆分的數據集) split(訓練集所占比例) trainingSet(訓練集) testSet(測試集) def splitDataSet(dataSet, split, trainingSet=[], testSet=[]): for x in range(len(dataSet)): if random.random() <= split: trainingSet.append(dataSet[x]) else: testSet.append(dataSet[x]) # 計算歐氏距離 def euclideanDistance(instance1, instance2, length): distance = 0 for x in range(length): distance += pow((instance1[x] - instance2[x]), 2) return math.sqrt(distance) # 選取距離最近的K個實例 def getNeighbors(trainingSet, testInstance, k): distances = [] length = len(testInstance) - 1 for x in range(len(trainingSet)): dist = euclideanDistance(testInstance, trainingSet[x], length) distances.append((trainingSet[x], dist)) distances.sort(key=operator.itemgetter(1)) neighbors = [] for x in range(k): neighbors.append(distances[x][0]) return neighbors # 獲取距離最近的K個實例中占比例較大的分類 def getResponse(neighbors): classVotes = {} for x in range(len(neighbors)): response = neighbors[x][-1] if response in classVotes: classVotes[response] += 1 else: classVotes[response] = 1 sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True) return sortedVotes[0][0] # 計算準確率 def getAccuracy(testSet, predictions): correct = 0 for x in range(len(testSet)): if testSet[x][-1] == predictions[x]: correct += 1 return (correct / float(len(testSet))) * 100.0 def main(): # 使用自定義創建的數據集進行分類 # x,y = createDataSet(features=2) # dataSet= np.c_[x,y] # 使用鳶尾花卉數據集進行分類 dataSet = loadIrisDataset(r'C:\DevTolls\eclipse-pureh2b\python\DeepLearning\KNN\iris_dataset.txt') print(dataSet) trainingSet = [] testSet = [] splitDataSet(dataSet, 0.75, trainingSet, testSet) print('Train set:' + repr(len(trainingSet))) print('Test set:' + repr(len(testSet))) predictions = [] k = 7 for x in range(len(testSet)): neighbors = getNeighbors(trainingSet, testSet[x], k) result = getResponse(neighbors) predictions.append(result) print('>predicted=' + repr(result) + ',actual=' + repr(testSet[x][-1])) accuracy = getAccuracy(testSet, predictions) print('Accuracy: ' + repr(accuracy) + '%') main()
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25在當今數字化時代,數據分析師的重要性與日俱增。但許多人在踏上這條職業道路時,往往充滿疑惑: 如何成為一名數據分析師?成為 ...
2025-04-24以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《劉靜:10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda ...
2025-04-23