買了王斌老師翻譯的《機器學習實戰》一書,裏面全是乾貨,既能夠練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算是一個很簡單的機器學習算法,它的假設是各特徵彼此相互獨立,而且權重相同(各特徵都作了歸一化,固然你也能夠加上權重值)。
好好學習,每天向上!