摘要:城市越大,圈子越小,人越感到孤單。相親,在對對方一無所知的狀況下,怎麼快速的掌握對方的信息呢?想知道眼前的帥哥有沒有房子,KNN,即K近鄰算法,即可以很好解決相親的問題。程序員
城市越大,圈子越小,人越感到孤單。懷念家鄉的小城市,隨便走一圈,幾乎到處都有熟人。城市大了,匯聚了全國的人,逛上一天,也不見得遇到個熟人。因而,尋找異性伴侶的新興方式--相親,便出現了。
01 樸素的思想算法
相親,在對對方一無所知的狀況下,怎麼快速的掌握對方的信息呢?能夠經過對方的朋友來識別。聊一下對方的親密朋友,聊他們去哪兒旅行,聊她們平時常逛的地方。話題也多,也不至於太直白地問對方收入,興趣等等。數據結構
經過她的朋友,你即可以間接的瞭解她。由於人都會和本身有共同興趣愛好的人交朋友。或者說,她們在一塊兒久了,天然會有不少類似的地方。這即是古老的哲學思想:「近朱者赤,近墨者黑」。咱們便由她的朋友來推斷出她的興趣愛好等等。 函數
02 算法介紹學習
在數據挖掘裏面,最經常使用也是簡單一個算法,即是:KNN,英文爲K-Nearest Neighbor,即K近鄰算法,這個算法即可以很好解決相親的問題。測試
算法很是簡單,一句話即可以說清楚,要想知道一個未知事物的類別,找出和它的最近的幾個鄰居,統計鄰居中的多數狀況,即可以表明未知事物的狀況。好比,想知道眼前的帥哥有沒有房子,假設你知道他的5個朋友中的3個都有房子,那麼,他頗有多是有房子的。優化
上面咱們對這個帥哥進行劃分類別,有房子仍是沒有房子。即是用KNN的思想,其中的「鄰居」便用「朋友」關係來代替。他和這些人作朋友,表示他和這些人走得近,換句專業術語來講,他和這些人的類似度很高,好比平時都喜歡出去唱K,都週末都喜歡去釣魚,甚至極可能都是搞IT的。spa
總結起來即是:在一堆物品之間,經過計算他們各屬性的類似度,找到和某個樣本最近的N個樣本,經過計算這N個樣本所屬的類別中的最多數,來歸類未知樣本的類別。這是一個基於案例的算法,沒有實際上的模型訓練階段,直接就是測試。由於不須要事先創建好模型,即可直接對物品進行分類。rest
上面中還隱藏了一個思想,即由鄰居進行投票決定,每人一票:少數服從多數,近鄰中哪一個類別的數目最多就劃分爲該類。圖片
03 分類與迴歸
KNN算法不只能夠用於分類,還能夠用於迴歸。經過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就能夠獲得該樣本的屬性。好比,在一個大會中,你想知道小扎的身家值多少錢。因而你便觀察,發現馬雲,馬化騰,小扎他們三個常常聚在一塊兒討論,那麼你即可以經過計算馬雲和馬化騰身家的平均值,來近似表示小扎的身家。雖然,現實中可能偏差比較大,但至少你不會認爲小扎的身家和一個屌絲程序員沒有區別。
這即是迴歸與數值預測的應用。固然,更有用的方法是將不一樣距離的鄰居對該樣本產生的影響給予不一樣的權值(weight),如權值與距離成反比。這即是加權投票法:根據距離的遠近,對近鄰的投票進行加權,距離越近則權重越大(能夠取權重爲距離的倒數),如小扎和馬雲站的距離近些,和馬化騰的距離遠些,那麼最後算平均的時候,就按他們距離的的倒數來進行加權求取平均,一般在某些狀況下,這樣會比單純求平均的偏差要小些。
04 算法與調優
KNN算法一般只有兩個參數須要注意,第一個是到底取多少個近鄰比較好(K參數),第二個是如何計算出樣本的K個近鄰。
對於參數K的取值,一般會根據具體問題來分析和嘗試,屢次嘗試應該會有一個比較好的結果。若是實在沒有好的方法,能夠試着取3,也許結果並不會太差,正所謂一輩子二,二生三,三生萬物。
至於計算類似度,這算是數據挖掘中很是通用的一個問題了,不少地方都會遇到。最簡單的方法固然是取二者的歐氏距離了,直觀理解就是二維平面或者三維空間中的兩個點的直線距離,越近表示越類似。還有不少計算類似性度量的方法,請查詢相關手冊。
在實際應用中,經過對樣本進行特徵向量的提取,預先選擇參數K和類似性度量方法,即可以開始計算了。KNN是一種lazy-learning(懶惰學習)算法,分類器不須要使用訓練集進行訓練,所以對測試樣本進行分類/迴歸時的計算量比較大,內存開銷也大。但最後的結果比較具備解釋性,由於你能夠分析樣本的K個近鄰的特徵。從而判別結論的好壞。
另一些經常使用的tricks(技巧),一個是如何進行加權計算,使得結果更準確。能夠採用均衡投票,也可使用類似性的線性函數來表示。
減少計算方面,還能夠經過縮小訓練計算的樣本數來進行,好比你能夠排隊掉相親美女周圍的已婚女性,畢竟她們的行爲有不少不一致的地方,這些人一般不太會出如今她的近鄰里面。也能夠對她的朋友進行聚類,好比把她朋友中20-30歲的聚在一塊兒,已婚和未婚的聚在一塊兒,這樣在每一個類別裏面找出一個具備表明性的人出來進行KNN算法。
最後,爲了能有效的找到最近鄰,一般還有兩種優化的數據結構:kd-tree和ball-tree,他們都會事先對全部樣本進行結構劃分和存儲,以便在測試的時候更快的找到須要的近鄰樣本。若是使用Python的話,Scikit-learn實現的KNN內置支持這兩種數據結構,能夠加快算法的執行速度。
05 具體應用
用於手寫數字識別;
文本分類;
異常檢測(攻擊檢測,欺詐偵測);
二手車價格預測;
……
對於相親,若是你是真心想找個靠譜的人結婚,經過各類渠道掌握了她的5個好朋友的各類信息,你經過統計發現,其中三個常常會用某約P神器,那麼能夠得出結論,你……應該離她遠點。