(原創)機器學習-KNN分類器

K-近鄰(k-Nearest NeighborsKNN)的原理算法

  經過測量不一樣特徵值之間的距離來衡量類似度的方法進行分類。數組

 

 KNN算法過程ide

訓練樣本集:樣本集中每一個特徵值都已經作好類別標籤;函數

測試樣本:  測試樣本中每一個特徵值都沒有類別標籤;測試

算法過程:  計算測試樣本中特徵值與訓練樣本集中的每一個特徵值之間的距離,提取與訓練樣本集中的特徵值距離最近的前K個樣本,而後選取出現次數最多的類別標籤,做爲測試樣本的類別標籤。人工智能

 

度量特徵值之間距離的方法spa

(1)   歐氏距離rest

可稱爲L2範數:code

clip_image002

其中p=2,則特徵向量a=(a1,a2,…,am)和特徵向量b=( b1,b2,…,bm)之間的距離爲orm

clip_image004


 

又稱歐式距離。

例如二維平面上的兩點a(x1, y1)b(x2, y2)之間的歐式距離:

clip_image006

 

d值越小,代表特徵值之間距離越小,兩個特徵越類似。

 

(2)   夾角餘弦

特徵向量a=(a1,a2,…,am)和特徵向量b=( b1,b2,…,bm)之間的夾角餘弦爲:

clip_image008


 

cos值越大,代表特徵值之間距離越小,兩個特徵越類似。

 

一個簡單的例子

      Python代碼示例:

# coding: utf-8
# 做者:tany  博客:http://www.cnblogs.com/tan-v/
from numpy import * import operator import matplotlib.pyplot as plt def createDataSet(): # 生成訓練集 group = array([[1.0, 1.1], [0.9, 1.3], [ 0, 0.1], [0.1, 0.2]]) labels = ['A', 'A', 'B', 'B'] return group, labels def showDataSet(dataSet, labels): # 顯示訓練集 fig = plt.figure() ax = fig.add_subplot(111) index = 0 for point in dataSet: if labels[index] == 'A': ax.scatter(point[0], point[1], c='blue') ax.annotate("A", xy = (point[0], point[1])) else: ax.scatter(point[0], point[1], c='red') ax.annotate("B", xy = (point[0], point[1])) index += 1 plt.show() def eulerDist(inXmat, dataSet): # 使用歐式距離 diffMat = inXmat - dataSet # 輸入向量分別與樣本中其餘的向量之差 sqDiffMat = diffMat**2 # 差值求平方 sqDistances = sqDiffMat.sum(axis=1) # axis=1將一個矩陣的每一行向量相加, 將差值相加 dist = sqDistances**0.5 # 開方 return dist def cosDist(inXmat, dataSet): # 使用夾角餘弦 m = shape(inXmat)[0] dist = zeros((m)) # 與訓練集中每個特徵求距離 for i in range(m): cos = dot(inXmat[i,:], dataSet[i,:])/(linalg.norm(inXmat[i,:])*linalg.norm(dataSet[i,:])) # 求餘弦值 dist[i] = cos return dist def KNNclassify(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] # 行數 inXmat = tile(inX, (dataSetSize, 1)) # tile(A,reps)若reps爲一個元組(m,n),則構造一個m行n列的數組,其中每一個元素均爲A, # 目的是求inX分別與其餘dataSet的數據間的距離 distance = eulerDist(inXmat, dataSet) # 使用歐式距離度量向量間距離 sortedDistIndicies = distance.argsort() # 對一個數組進行升序排列,結果返回的就是a中全部元素排序後各個元素在a中以前的下標 #distance = cosDist(inXmat, dataSet) # 使用夾角餘弦度量向量間距離 #sortedDistIndicies = argsort(-distance) # 降序排列 classcount = {} # 字典 for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classcount[voteIlabel] = classcount.get(voteIlabel,0) + 1 # dict.get(key, default=None) key:字典中要查找的鍵。 # default -- 若是指定鍵的值不存在時,返回該默認值。 # classcount.iteritems()返回一個迭代器。返回一個能夠調用的對象(能夠從操做對象中提取item) # operator.itemgetter函數獲取的不是值,而是定義了一個函數。獲取對象的第1個域的值在這裏使用字典中的值進行從小到大進行排序 # sorted(iterable, cmp, key, reverse),iterable指定要排序的list或者iterable, # cmp爲函數,指定排序時進行比較的函數,能夠指定一個函數或者lambda函數 # key爲函數,指定取待排序元素的哪一項進行排序 # reverse默認爲false(升序排列),定義爲True時將按降序排列。 sortedClassCount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0] dataSet, labels = createDataSet(); # 生成訓練集 showDataSet(dataSet,labels) # 顯示訓練集 inX = array([1, 1]) # 輸入一個測試樣本 classLabel = KNNclassify(inX, dataSet, labels, 3) # 使用KNN進行分類 print classLabel # 輸入分類以後所屬的標籤

 

執行結果:

image

 

               -tany 2017年10月4日 中秋 於杭州

 

 

人工智能從入門到專家教程資料:https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.38270209gU11fS&id=562189023765

相關文章
相關標籤/搜索