《機器學習實戰》之knn算法

  買了王斌老師翻譯的《機器學習實戰》一書,裏面全是乾貨,既能夠練python,又能夠學習機器學習算法知識,挺不錯的,學習一些東西這裏分享下。python

  k-近鄰算法(knn),它的核心思想就一句話,若是兩個東西各方面屬性都很類似,那麼這兩個東西屬於同一類。k的意思是有不少東西和你要判斷的東西類似(稱做x),算法

 那麼找出和x各方面屬性最類似的k個東西,若是這k個東西里面大部分都屬於類C,那麼x就屬於類C。小程序

  好了,來分析一下這個算法須要的數據,首先要判斷的東西x,咱們稱做測試集,咱們知道x各類屬性的值(後面統稱特徵),可是不知道x屬於哪一類,結果就是求這個。機器學習

還有其餘不少東西,咱們不只知道它們的特徵,還知道它們屬於哪一類,這些東西稱做訓練集。函數

    來個書上簡單的例子說明下:學習

    電影名稱    打鬥鏡頭    接吻鏡頭    電影類型測試

California Man        3        104      愛情片spa

He's Not---         2        100      愛情片翻譯

Beautiful Woman     1        81      愛情片code

x          18        90      ?

上面這個表你們能夠看到電影這個東西有三個特徵,電影名稱,打鬥鏡頭,接吻鏡頭,前三個電影咱們知道他們的類別,他們屬於訓練集,後面一個電影x咱們只知道他們的特徵,不知道類別,怎麼用knn來算這個。

1.算x和其餘電影的類似度

2.找出最類似的k個電影

3.對這k個電影的類別進行排名,選擇類別最多的做爲x的類別。

類似度的計算採用的是歐式距離法,d=((x1-x2)2+(y1-y2)2+(z1-z2)2)1/2,對於一個電影i能夠表示成(xi,yi,zi),x,y,z分別表示電影三個特徵的值。

注意:x,y,z的值通常須要縮放至0-1之間,保證每一個特徵具備相同的權重,newValue=(oldValue-min)/(max-min).

下面附上一段書上關於knn算法一個小例子:

'''
2013.12.26
《機器學習實戰》knn小實例源碼學習
'''
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是array的一個屬性,返回矩陣array的各個維度大小
    dataSetSize=dataSet.shape[0]
    #tile函數表示將inX在x軸上重複dataSetSize次,y軸上重複1次
    diffMat=tile(inX,(dataSetSize,1))-dataSet
    #**用於矩陣作冪運算,每一個維數值的平方。
    sqDiffMat=diffMat**2
    #sum函數,axis=1,表示將[]裏面數相加(列相加),axis=0表示(行相加),axis=None(行列相加)
    sqDistances=sqDiffMat.sum(axis=1)
    #下面這就是距離了,開根號
    distances=sqDistances**0.5
    #返回distances排序的索引,用於下面查找標籤
    sortedDistIndicies=distances.argsort()
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]
        #統計標籤個數
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    #operator 類有意思,能夠看看    
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]
group,labels=createDataSet()
print(classify0([0,0],group,labels,3))

'''
小程序能夠發散的知識點:
1.tile函數理解,能夠本身寫個簡單實現源碼
2.sorted函數幫助文檔看懂,實現猜測,理解
3.operator類應該是操做符重載裏面一些東東,能夠看看
學語言最快果真仍是看源碼,一些功能別人實現的老是簡潔些。
'''

我用的是python 3.2,低版本可能有些名字須要改一下。

knn算是一個很簡單的機器學習算法,它的假設是各特徵彼此相互獨立,而且權重相同(各特徵都作了歸一化,固然你也能夠加上權重值)。

好好學習,每天向上!

相關文章
相關標籤/搜索