您好,登錄后才能下訂單哦!
這篇文章主要講解了“kNN算法怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“kNN算法怎么使用”吧!
一、概述
優點:精度高、對異常值不敏感、無數據輸入限定
缺點:計算復雜度高、空間復雜度高
使用數據范圍:數值型和標稱型。
二、原理
存在一個樣本數據集合(訓練樣本集合),并且樣本集中每一個數據都存在標簽,即我們知道樣本集中每一個數據與所屬分類的對應關系。輸入沒有標簽的新數據,將新數據的每個特征值與樣本集中的數據對應的特征進行比較。然后算法提取樣本集中特征最相似的分類標簽。通常k不大于20的整數。
三、例子1:電影分類
分類愛情片和動作片。統計很多電影中打斗鏡頭和接吻鏡頭。
電影名稱 | 打斗鏡頭 | 接吻鏡頭 | 電影類型 |
california man | 3 | 104 | 愛情片 |
he's not really into dudes | 2 | 100 | 愛情片 |
beautiful woman | 1 | 81 | 愛情片 |
kevin longblade | 101 | 10 | 動作片 |
robo slayer 3000 | 99 | 5 | 動作片 |
amped II | 98 | 2 | 動作片 |
? | 18 | 90 | ? |
電影名稱 | 與未知電影距離 |
california man | 20.5 |
he's not really into dudes | 18.7 |
beautiful woman | 19.2 |
kevin longblade | 115.3 |
robo slayer 3000 | 117.4 |
amped II | 118.9 |
假定k=3 依次是california man,he's not really into dudes,beautiful woman ===> 判定為愛情片
四、例子2:約會網站的配對效果
玩視頻游戲所耗時間百分比 | 每年獲得飛行常客里程數 | 每周消費的冰激凌公升數 | 樣本分類 |
0.8 | 400 | 0.5 | 1 |
12 | 134000 | 0.9 | 3 |
0 | 20000 | 1.1 | 2 |
1.收集數據:提供文本文件
==>每個樣本數據占據一行,總共1000行,包含3個特征
a.每年獲得飛行常客里程數
b.玩視頻游戲所耗時間百分比
c.每周消費的冰激凌公升數
2.準備數據:數據歸一化
kNN使用歐幾里得距離公式
[(0.8-12)^2 + (400 - 134000)^2 + (0.5 - 0.9)^2]^0.5
===> 容易看出,數值大的屬性對計算結果的影響最大。也就是說“每年獲得飛行常客里程數”的影響要遠遠大于其他屬性的影響。我們需要等權重特征化。
newValue = (oldValue - min)/(max - min)
$ cat datingTestSet2.txt | head -n 4 40920 8.326976 0.953952 3 14488 7.153469 1.673904 2 26052 1.441871 0.805124 1 75136 13.147394 0.428964 1 # 文本文件轉換成數據矩陣 def file2matrix(filename): fr = open(filename) arrayOLines = fr.readlines() ==>讀取文檔有多少行,要構建矩陣 numberOfLines = len(arrayOLines) returnMat = zeros((numberOfLines,3)) ==>初始0矩陣 classLabelVector= [] index = 0 for line in arrayOLines: line = line.strip() listFromLine = line.split('\t') ==> \t 分隔每一行 returnMat[index,:] = listFromLine[0:3] ==> 每一行特征值組成矩陣的一行 classLabelVector.append(int(listFromLine[-1])) ==> 標簽向量 index += 1 return returnMat,classLabelVector #數據歸一化 #newValue = (oldValue - min)/(max - min) def autoNorm(dataSet): minVals = dataSet.min(0) ==>計算矩陣每一列最小值 maxVals = dataSet.max(0) ==>計算矩陣每一列最大值 ranges = maxVals - minVals ==>矩陣相減,即對應行向減 m = dataSet.shape[0] ==>矩陣行數 normDataSet = dataSet - tile(minVals, (m,1)) ==>tile(minVals, (m,1))構建行數相同的最小值矩陣 normDataSet = normDataSet / tile(ranges, (m,1)) ==>tile(ranges, (m,1))構建行數相同的差值矩陣 return normDataSet,ranges,minVals def datingClassTest(): hoRatio = 0.1 ==>切分樣本,一部分作為訓練樣本,一部分作為測試樣本 datingDataMat,datingLabels = file2matrix('') ==>加載文本文件,并轉化為數據矩陣 normMat,ranges,minVals = autoNorm(datingDataMat) ==>數據歸一化 m = normMat.shape[0] numTestVecs = int(m*hoRatio) errorCount = 0.0 for i in range(numTestVecs): classifierResult = classify0(normMat[i,:], normMat[numTestVecs:m,:], datingLabels[numTestVecs:m], 3) ==>對輸入的測試集的每一行進行判定 print 'the classifier came back with:%d, the real answer is:%d' % (classifierResult,datingLabels[i]) if(classifierResult != datingLabels[i]): ==>對比計算結果和原始結果,統計錯誤率 errorCount+=1.0 print 'the total error rate is: %f' % (errorCount/float(numTestVecs)) print errorCount
感謝各位的閱讀,以上就是“kNN算法怎么使用”的內容了,經過本文的學習后,相信大家對kNN算法怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。