基于Dragonboard 410c開發(fā)板的機器學習研究(一)K-近鄰算法
機器學習與人工智能一起作為當前最流行的一個概念,目前已經(jīng)被廣泛的應用到各個領域,如人們常用的微信、支付寶、百度等,這些軟件里面都集成了機器學習算法,以實現(xiàn)各種智能化的操作,讓用戶體驗更加,如在百度的在線識別圖像應用,阿里巴巴的商品智能推薦、人臉識別驗證等這些都用到了機器學習的相關技術,當然有的是更高級的深度學習(其實質(zhì)也是機器學習的一種,更加高大上,具體概念以及關于機器學習、深度學習和模式識別大家可以參考深度學習 vs 機器學習 vs 模式識別三種技術對比這篇文章),但是機器學習只能用在這些高大上的地方么?當然不是,其實在我們普通的開發(fā)者想DIY自己的東西的時候,也可以用到機器學習,如在你的智能車視覺避障中就可以用機器學習來構(gòu)建障礙物模型,在人臉識別中就可以用機器學習來不斷優(yōu)化識別結(jié)果,好了廢話不多說了,如果能夠在自己的DIY中,在你的Dragonboard 410c中用上機器學習,是不是更高大上?
機器學習的算法非常多,今天給大家來一個入門級別的,也是機器學習中最簡單的一個算法,K-近鄰算法(KNN),該算法是采用不同特征值之間的距離的方法來對不同的對象進行分類,在具體的操作過程中我們需要一個樣本集,這個樣本集中的所有的特征數(shù)據(jù)都有一個對應的標簽,即這個樣本集中所有的數(shù)據(jù)所對應的分類屬性我們是知道的,然后再輸入新的數(shù)據(jù)的時候,KNN算法就通過計算實現(xiàn)新數(shù)據(jù)與樣本數(shù)據(jù)的比較,同時提取樣本中特征最相似的數(shù)據(jù)對應的分類標簽,在具體的KNN處理過程中,通常只選取樣本數(shù)據(jù)的前k個最相似的數(shù)據(jù),然后選取這前k個數(shù)據(jù)中出現(xiàn)次數(shù)最多的標簽作為結(jié)果。
有了上述了解了,基本上你只要知道KNN就是一個簡單的分類器,將東西進行分類,既然提到了分類,我們通過生活中簡單的一個分類場景來向大家介紹KNN算法的具體實現(xiàn)原理和過程,并且結(jié)合Python腳本告訴大家怎么在Dragonbaord 410c上編寫和運行KNN算法。
這里引用的是《機器學習實戰(zhàn)》中的一個經(jīng)典的學習例子,根據(jù)電影中出現(xiàn)的接吻鏡頭和打斗鏡頭的數(shù)量來判斷一部電影是屬于愛情片還是屬于動作片,具體可以通過下圖來進行描述:
在上圖中,我們已經(jīng)知道了六部電影的接吻鏡頭和打斗鏡頭的數(shù)目,但是如果給你一個新的電影,并且告訴你了接吻鏡頭和打斗鏡頭數(shù),這個時候你該如何確定這部電影是什么類型電影呢?
在分析中,為了更好的看出我們已經(jīng)知道的六部電影的各種鏡頭的數(shù)量和所屬類型,下面給出了各個電影的鏡頭和類型分布表:
根據(jù)前面跟大家聊的KNN算法原理,我們主要是根據(jù)樣本數(shù)據(jù),計算未知的數(shù)據(jù)與樣本數(shù)據(jù)的距離,然后根據(jù)標簽出現(xiàn)頻率來實現(xiàn)分類,這里我們?nèi)绻肒NN來實現(xiàn)對根據(jù)已知的這六部電影的分類,來實現(xiàn)對未知電影的分類就非常簡單了。其中KNN實現(xiàn)核心代碼如下:
def classify0(inX, dataSet, labels, k):
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):
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個參數(shù),分別用于輸入向量inX、輸入訓練樣本集dataSet、標簽向量labels,選擇最近鄰居的數(shù)目參數(shù)k,在本文使用的KNN算法中,計算距離使用了常用的歐氏距離公式,如下:
詳細的代碼大家可以到 http://pan.baidu.com/s/1mh5W0XU 下載,
好了,準備好代碼后,我們就可以進行測試了,將代碼通過SD卡或者U盤拷貝到我們的Dragonbaord 410c上,然后輸入cd命令跳轉(zhuǎn)到代碼目錄下,輸入Python,進入到Python命令模式,輸入下面測試命令:
>>> import kNN
>>> group,lables = kNN.createDataSet()
>>>kNN,classify0([0,0],group,lables,3)
我們可以看到輸出結(jié)果為B,如下圖所示,同時大家在測試過程中也可以改變輸入的[0,0]為其他值,測試結(jié)果。
到這里我們已經(jīng)成功的完成在Dragonbaord 410c上借助于Python腳本完成了我們KNN算法的編寫和測試,利用測試代碼大家可以進行擴展,將該分類器用于你的DIY中的其他識別和分類中,讓你的DIY變得更加智能,后期我將在機器學習系列blog中向大家進一步介紹更為復雜的機器學習算法和在Dragonbaord410c上實現(xiàn)。