《機器學習實戰》k最近鄰演算法(K-Nearest Neighbor,Python實現)

Thinkgamer_gyt發表於2015-08-11
============================================================================================
《機器學習實戰》系列部落格是博主閱讀《機器學習實戰》這本書的筆記,包含對其中演算法的理解和演算法的Python程式碼實現

另外博主這裡有機器學習實戰這本書的所有演算法原始碼和演算法所用到的原始檔,有需要的留言
============================================================================================


一、什麼是看KNN演算法?
二、KNN演算法的一般流程
三、KNN演算法的Python程式碼實現


numpy 模 塊 參 考教程:http://old.sebug.net/paper/books/scipydoc/index.html
決策樹(ID3)演算法請參考:http://blog.csdn.net/gamer_gyt/article/details/47679017

一:什麼是看KNN演算法?
        kNN演算法全稱是k-最近鄰演算法(K-Nearest Neighbor)
        kNN演算法的核心思想是如果一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。

下邊舉例說明:

即使不知道未知電影屬於哪種型別,我們也可以通過某種方法計算出來,如下圖

現在我們得到了樣本集中與未知電影的距離,按照距離的遞增順序,可以找到k個距離最近的電影,假定k=3,則三個最靠近的電影是和he is not realy into Dudes,Beautiful women, California man kNN演算法按照距離最近的三部電影型別決定未知電影型別,這三部都是愛情片,所以未知電影的型別也為愛情片
二:KNN演算法的一般流程

step.1---初始化距離為最大值

step.2---計算未知樣本和每個訓練樣本的距離dist

step.3---得到目前K個最臨近樣本中的最大距離maxdist

step.4---如果dist小於maxdist,則將該訓練樣本作為K-最近鄰樣本

step.5---重複步驟2、3、4,直到未知樣本和所有訓練樣本的距離都算完

step.6---統計K-最近鄰樣本中每個類標號出現的次數

step.7---選擇出現頻率最大的類標號作為未知樣本的類標號


三、KNN演算法的Python程式碼實現
#encoding:utf-8
from numpy import *
import operator

def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group,labels

def classify0(inX,dataSet,labels,k):
    #返回“陣列”的行數,如果shape[1]返回的則是陣列的列數
    dataSetSize = dataSet.shape[0]
    #兩個“陣列”相減,得到新的陣列
    diffMat = tile(inX,(dataSetSize,1))- dataSet
    #求平方
    sqDiffMat = diffMat **2
    #求和,返回的是一維陣列
    sqDistances = sqDiffMat.sum(axis=1)
    #開方,即測試點到其餘各個點的距離
    distances = sqDistances **0.5
    #排序,返回值是原陣列從小到大排序的下標值
    sortedDistIndicies = distances.argsort()
    #定義一個空的字典
    classCount = {}
    for i in range(k):
        #返回距離最近的k個點所對應的標籤值
        voteIlabel = labels[sortedDistIndicies[i]]
        #存放到字典中
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
    #排序 classCount.iteritems() 輸出鍵值對 key代表排序的關鍵字 True代表降序
    sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True)
    #返回距離最小的點對應的標籤
   return sortedClassCount[0][0]

呼叫方式:開啟CMD,進入kNN.py檔案所在的目錄,輸入Python,依次輸入import kNN     group,labels = kNN.createDataSet()    kNN.classify0([0,0],group,lables,3)


相關文章