Python的使用我就不詳細介紹了,因爲我自己也不是特別熟悉(O(∩_∩)O哈哈~),不過Python和matlab差不多,語法很簡單,用多了看多了自然就熟悉了,我之所以記錄“machine learning in action”主要的目的也不是熟悉python,主要是記錄我的學習過程,想提高自己的算法邏輯能力,而主要的切入點是常見的machine learning算法。所以接下來的教程中,編程語法我不太會多說,主要側重於算法應用。
以下介紹的任何內容,大家有任何疑問,或者是對我有任何建議,可以隨時在評論中提出來,我會盡量經常去查看,並給大家回覆。
第一個要講的算法是k-Nearest Neighbors(K-NN),即K-近鄰算法,也是機器學習算法中最常見且簡單的一個分類算法,主要採用測量不同特徵值之間的距離來進行分類。
K-NN工作原理是:存在一個樣本數據集合,也稱爲訓練樣本集,並且樣本集中每個數據都有標籤(label),即我們知道樣本集中每個數據所屬分類的對應關係。輸入一個沒有標籤的新數據後,將新數據的每個特徵與樣本集中數據對應的特徵進行比較,然後算法提取樣本集中特徵最相近數據(最近鄰)的分類標籤。一般來說,我們只選擇樣本數據集中前K個最相近的數據,這就是k-近鄰算法中k的出處,通常k是不大於20的整數。最後,選擇k個最相近數據中出現次數最多的分類,作爲新數據的分類結果。
這個算法原理很簡單,所以我就不多說了,直接講解代碼實現。
功能:使用k-近鄰算法將每組數據劃分到某個類別中,僞代碼如下:
對未知類別屬性的數據集中的每個點依次執行以下操作:
(1)計算已知類別數據集中的點與當前點之間的距離;
(2)按照距離遞增次序排序;
(3)選取與當前點距離最小的k個點;
(4)確定前k個點所在類別的出現頻率;
(5)返回前k個點出現頻率最高的類別作爲當前點的預測分類。
Python實現classify0(),如下:
# 程序清單2-1 k-近鄰算法
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
# 距離計算
# tile: repeat the items N times
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
# 選擇距離最小的k個點
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(),
key = operator.itemgetter(1),
reverse = True)
return sortedClassCount[0][0]
classify0()函數有4個輸入參數:用於分類的輸入向量inX,輸入的訓練樣本集dataSet,標籤向量labels,最後參數k表示用於選擇最近鄰的數目,其中標籤向量的元素個數和矩陣dataSet的行數相同。程序清單2-1中使用歐氏距離公式(當然你可以換成其他的距離計算公式),計算兩個向量點xA和xB之間的距離:
如果特徵是多維的,那麼依次加在後面即可。
這樣,我們就構建了一個簡單的k-NN分類器了,使用這個分類器可以完成很多分類任務。
舉個簡單的例子:首先創建一個已知標籤的訓練集,這個數據集中只有4個數據{(1.0,1.1), (1.0,1.0), (0,0), (0,0.1)},前兩個屬於A類,後兩個屬於B類,python代碼如下:
# 程序清單2-2 數據導入模塊
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
實驗測試,創建名爲kNN.py的python模塊,將程序清單2-1和2-2輸入到這個文件中。
進入python開發環境,開始——運行——cmd——進入kNN文件夾——python,
首先導入kNN模塊,然後查看導入的數據集
>>> import kNN
>>> group,labels = kNN.createDataSet()
結果如下:
然後使用classify0()進行數據分類預測
>>> kNN.classify0([0,0], group, labels, 3)
輸出結果爲:
即預測結果爲[0,0]屬於“B”類,大家可以自己試試其他的數據分類結果。
到此,kNN簡單的分類器構建完成了,接下來會用構建的kNN處理實際問題。