機器學習可分爲監督學習和無監督學習。有監督學習就是有具體的分類信息,好比用來斷定輸入的是輸入[a,b,c]中的一類;無監督學習就是不清楚最後的分類狀況,也不會給目標值。python
K-近鄰算法屬於一種監督學習分類算法,該方法的思路是:若是一個樣本在特徵空間中的k個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。算法
須要進行分類,分類的依據是什麼呢,每一個物體都有它的特徵點,這個就是分類的依據,特徵點能夠是不少,越多分類就越精確。機器學習
機器學習就是從樣本中學習分類的方式,那麼就須要輸入咱們的樣本,也就是已經分好類的樣本,好比特徵點是A , B2個特徵,輸入的樣本甲乙丙丁,分別爲[[1.0, 1.1], [1.0, 1.0], [0., 0.], [0.0, 0.1]]。 那麼就開始輸入目標值,固然也要給特徵了,最終的目標就是看特徵接近A的多仍是B的多,若是把這些當作座標,幾個特徵點就是幾緯座標,那麼就是座標之間的距離。那麼問題來了,要怎麼看接近A的多仍是B的多。學習
我就直接貼代碼了,基於python,首先輸入特徵量labels和樣本group。測試
一開始須要導入的模塊spa
#coding=utf-8 #科學計算包 #from numpy import * import numpy #運算符模塊 import operator
數據樣本和分類模擬code
#手動創建一個數據源矩陣group,和數據源的分類結果labels def createDataSet(): group = numpy.array([[1.0, 1.1], [1.0, 1.0], [5., 2.], [5.0, 0.1]]) labels = ['A', 'A', 'B', 'B'] return group, labels
而後進行KNN算法。blog
# newInput爲輸入的目標,dataset是樣本的矩陣,label是分類,k是須要取的個數 def kNNClassify(newInput, dataSet, labels, k): #讀取矩陣的行數,也就是樣本數量 numSamples = dataSet.shape[0] print 'numSamples: ' ,numSamples #變成和dataSet同樣的行數,行數=原來*numSamples,列數=原來*1 ,而後每一個特徵點和樣本的點進行相減 diff = numpy.tile(newInput, (numSamples, 1)) - dataSet print 'diff: ',diff #平方 squaredDiff = diff ** 2 print "squaredDiff: ",squaredDiff #axis=0 按列求和,1爲按行求和 squaredDist = numpy.sum(squaredDiff, axis = 1) print "squaredDist: ",squaredDist #開根號,距離就出來了 distance = squaredDist ** 0.5 print "distance: ",distance #按大小逆序排列 sortedDistIndices = numpy.argsort(distance) print "sortedDistIndices: ",sortedDistIndices classCount = {} for i in range(k): #返回距離(key)對應類別(value) voteLabel = labels[sortedDistIndices[i]] print "voteLabel: " ,voteLabel # 取前幾個K值,可是K前幾個值的大小沒有去比較,都是等效的 classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 print "classCount: " ,classCount maxCount = 0 #返回佔有率最大的 sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0]
最後進行測試utf-8
dataSet, labels = createDataSet() testX = numpy.array([0, 0]) k = 3 outputLabel = kNNClassify(testX, dataSet, labels, k) print "Your input is:", testX, "and classified to class: ", outputLabel
能夠發現輸出get
numSamples: 4 diff: [[-1. -1.1] [-1. -1. ] [-5. -2. ] [-5. -0.1]] squaredDiff: [[ 1.00000000e+00 1.21000000e+00] [ 1.00000000e+00 1.00000000e+00] [ 2.50000000e+01 4.00000000e+00] [ 2.50000000e+01 1.00000000e-02]] squaredDist: [ 2.21 2. 29. 25.01] distance: [ 1.48660687 1.41421356 5.38516481 5.0009999 ] sortedDistIndices: [1 0 3 2] voteLabel: A voteLabel: A voteLabel: B classCount: {'A': 2, 'B': 1} Your input is: [0 0] and classified to class: A
這裏我以前一直有個疑問,關於K的取值,結果也許跟K的取值產生變化,只要在K的取值範圍內們全部特徵點距離遠近也就沒有關係了。因此才叫K近鄰分類算法