精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

通過簡單的暴力求解的方式實現KNN算法

電子工程師 ? 來源:lq ? 2019-02-04 10:29 ? 次閱讀

一、KNN回顧

k 近鄰學習是一種常用的監督學習方法,比如:判斷一個人的人品,只需要觀察與他來往最密切的幾個人的人品好壞就可以得出,即“近朱者赤,近墨者黑”。

理論/原理:“物以類聚,人以群分”

相同/近似樣本在樣本空間中是比較接近的,所以可以使用和當前樣本比較近的其他樣本的目標屬性值作為當前樣本的預測值。

k 近鄰法的工作機制很簡單:

給定測試樣本,基于某種距離度量(一般使用歐幾里德距離)找出訓練集中與其最靠近的k個訓練樣本,然后基于這k個“鄰居”的信息來進行預測。

二、KNN三要素

1、K值的選擇

對于K值的選擇,一般根據樣本分布選擇一個較小的值,然后通過交叉驗證來選擇一個比較合適的最終值;

當選擇比較小的K值的時候,表示使用較小領域中的樣本進行預測,訓練誤差會減小,但是會導致模型變得復雜,容易導致過擬合;

當選擇較大的K值的時候,表示使用較大領域中的樣本進行預測,訓練誤差會增大,同時會使模型變得簡單,容易導致欠擬合;

2、距離度量

一般使用歐幾里德距離

關于距離度量,還有其他方式

3、決策規則

KNN在做回歸和分類的主要區別在于最后做預測時的決策方式不同:

(1)分類預測規則:一般采用多數表決法或者加權多數表決法

假設圖中 “?”表示待預測樣本,紅色圓表示一類,藍色方塊表示一類,2和3表示到待預測樣本的距離

1. 多數表決法:

每個鄰近樣本的權重是一樣的,也就是說最終預測的結果為出現類別最多的那個類;

如圖,待預測樣本被預測為紅色圓

2. 加權多數表決法:

每個鄰近樣本的權重是不一樣的,一般情況下采用權重和距離成反比的方式來計算,也就是說最終預測結果是出現權重最大的那個類別;

如圖,紅色圓到待預測樣本的距離為3,藍色方塊到待預測樣本的距離為2,權重與距離成反比,所以藍色的權重比較大,待預測樣本被預測為藍色方塊。

(2)回歸預測規則:一般采用平均值法或者加權平均值法

假設上圖中的2和3表示鄰近樣本的目標屬性值(標簽值),此時沒有類別,只有屬性值

1、平均值法

每個鄰近樣本的權重是一樣的,也就是說最終預測的結果為所有鄰近樣本的目標屬性值的均值;

如圖,均值為(3+3+3+2+2)/5=2.6

2、加權平均值法

圖中,雙箭頭線上的數表示到待預測樣本的距離

每個鄰近樣本的權重是不一樣的,一般情況下采用權重和距離成反比的方式來計算,也就是說在計算均值的時候進行加權操作;

如圖,權重分別為(各自距離反比占距離反比總和的比例):

屬性值為3的權重:

屬性值為2的權重:

待預測樣本的加權平均值為:

三、手寫 k 近鄰算法

實現kNN分類算法的偽代碼:

對未知類別屬性的數據集中的每個點依次執行一下操作:

(1)計算已知類別數據集中的點與當前點之間的距離

(2)按照距離遞增次序排序

(3)選取與當前點距離最小的k個點

(4)確定前k個點所在類別的出現頻數

(5)返回當前k個點出現頻數最高的類別作為當前點的預測分類

歐氏距離公式:

例如求點(1,0,0,1) (1,0,0,1)(1,0,0,1)和(7,6,9,4) (7,6,9,4)(7,6,9,4)之間的距離:

檢測分類器效果:

可以使用已知類別的數據(當然不告訴分類器),檢驗分類器給出的結果是否與已知類別相同,通過大量的測試數據,我們可以計算出分類器的錯誤率。

以上算法的實現是用于分類的,決策規則使用了多數表決法;此算法通過改變決策規則,同樣可以用于回歸。

源代碼可見:https://github.com/Daycym/Machine_Learning/tree/master/03_KNN;01_k近鄰算法.py

四、使用手寫k kk 近鄰算法的案例

1、案例1:約會網站的配對效果

樣本包括3種特征:

每年獲得的飛行常客里程數

視頻游戲所耗時間百分比

每周消費的冰淇淋公升數

樣本包括3種標簽:

不喜歡的人

魅力一般的人

極具魅力的人

部分數據格式為:

代碼可見:02_約會網站的配對效果.py

2、案例2:手寫數字識別系統

數據集包括訓練集和測試集

數據是32*32的二進制文本文件

需要將文本數據轉換為Numpy數組

如下是0的一種表示:

100000000000001100000000000000000 200000000000011111100000000000000 300000000000111111111000000000000 400000000011111111111000000000000 500000001111111111111100000000000 600000000111111100011110000000000 700000001111110000001110000000000 800000001111110000001110000000000 90000001111110000000111000000000010000000111111000000011110000000001100000011111100000000011100000000120000001111110000000001110000000013000000111110000000000011100000001400000011111000000000001110000000150000000111110000000000011100000016000000011111000000000001110000001700000001111100000000000111000000180000001111100000000000011100000019000000111110000000000001110000002000000000111100000000000011100000210000000011110000000000011110000022000000001111000000000001111000002300000000111100000000001111100000240000000001111000000000011111000025000000000111110000000011111000002600000000011111000000011111100000270000000001111100000011111100000028000000000111111000111111110000002900000000000111111111111110000000300000000000011111111111110000000031000000000000111111111100000000003200000000000000111110000000000000

預測錯誤的總數為:10

手寫數字識別系統的錯誤率為:0.010571

代碼可見:03_手寫數字識別系統.py

五、KD樹

KNN算法的重點在于找出K個最鄰近的點,主要方法如下:

1、蠻力實現(brute)

計算出待預測樣本到所有訓練樣本的訓練數據,然后選擇最小的K個距離即可得到K個最鄰近點;

當特征數比較多,樣本數比較多的時候,算法的執行效率比較低。

2、KD樹(KD_Tree)

KD_Tree算法中,首先是對訓練數據進行建模,構建KD樹,然后再根據構建好的模型來獲取鄰近樣本數據

KD_Tree是KNN算法中用于計算最近鄰的快速、便捷構建方式

除此之外,還有一些從KD_Tree修改后的求解最鄰近點的算法,比如:Ball Tree、BBF Tree、MVP Tree等

當樣本數據量少的時候,我們可以使用brute這種暴力的方式進行求解最近鄰,即計算到所有樣本的距離。

當樣本量比較大的時候,直接計算所有樣本的距離,工作量有點大,所以在這種情況下,我們可以使用kd tree來快速的計算。

(1)KD數的構建

KD樹采用從m個樣本的n維特征中,分別計算n個特征取值的方差,用方差最大的第 k 維特征作為根節點。對于這個特征,選擇取值的中位數作為樣本的劃分點,對于小于該值的樣本劃分到左子樹,對于大于等于該值的樣本劃分到右子樹,對左右子樹采用同樣的方式找方差最大的特征作為根節點,遞歸即可產生KD樹。

假設二維樣本為:{(2, 3), (5, 4), (9, 6), (4, 7), (8, 1), (7, 2)},下面我們來構建KD樹:

1、計算每個特征的方差,取方差最大的作為根節點

方差表示數據的離散程度,離散程度越大,值越大。因此,選擇第1維特征x1作為根節點。

2、選取中位數作為劃分點

x1取值為2,4,5,7,8,9 2,4,5,7,8,92,4,5,7,8,9中位數取7來劃分,小于該值的放在左子樹,大于該值的放在右子樹

3、特征空間劃分:

(2)KD tree查找最近鄰

當我們生成KD樹以后,就可以取預測測試集里面的樣本目標點了。

對于一個目標點,我們首先在KD樹里面尋找包含目標點的葉子節點;

以目標點為圓心,以目標點到葉子節點樣本實例的距離為半徑,得到一個超球體,最近鄰的點一定在這個超球體內部;

然后返回葉子節點的父節點,檢查另一個子節點包含的超矩形體是否和超球體相交,如果相交就到這個子節點尋找是否有更加近的近鄰,有點話就更新最近鄰;如果不相交那就直接返回父節點的父節點,在另一個子樹繼續搜索最近鄰;

當回溯到根節點時,算法就結束了,保存最近鄰節點就是最終的最近鄰。

假設要尋找點(2,2.5) (2,2.5)(2,2.5)的最近鄰點:

六、KNN案例

1、鳶尾花數據分類

使用Logistic算法和KNN算法對鳶尾花數據進行分類,比較結果;

具體內容在代碼的注釋中有介紹;

畫出下面兩張圖,需要將代碼整合起來,才能畫出來。

代碼可見:https://github.com/Daycym/Machine_Learning;02_Logistic回歸下05_鳶尾花數據分類.py,以及03_KNN目錄下04_鳶尾花數據分類.py。

2、信貸審批

具體內容將在代碼中介紹

代碼可見:https://github.com/Daycym/Machine_Learning;02_Logistic回歸下03_信貸審批.py,以及03_KNN目錄下05_信貸審批.py。

七、總結

本篇主要通過簡單的暴力求解的方式實現KNN算法,有助于理解KNN算法

后面又介紹了KD樹找K個最近鄰,此算法是最快捷的

最后通過sklearn庫下的KNeighborsClassifier實現了兩個案例,來屬性KNN模型的構建

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二進制
    +關注

    關注

    2

    文章

    794

    瀏覽量

    41601
  • KNN
    KNN
    +關注

    關注

    0

    文章

    22

    瀏覽量

    10797
  • 數據集
    +關注

    關注

    4

    文章

    1205

    瀏覽量

    24647

原文標題:一文搞懂K近鄰算法(KNN),附帶多個實現案例

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于kNN算法可以診斷乳腺癌

    kNN算法診斷乳腺癌
    發表于 06-21 09:31

    Java的KNN算法

    3在Java中使用K最近鄰(KNN)分類器
    發表于 09-10 13:48

    KNN算法原理

    KNN(K近鄰算法
    發表于 11-01 09:14

    KNN分類算法及python代碼實現

    kNN分類算法的Python實現
    發表于 06-05 12:02

    使用KNN進行分類和回歸

    一般情況下k-Nearest Neighbor (KNN)都是用來解決分類的問題,其實KNN是一種可以應用于數據分類和預測的簡單算法,本文中我們將它與
    發表于 10-28 14:44

    利用KNN算法實現基于系統調用的入侵檢測技術

    算法來自一種文本分類算法-KNN 算法,文中給出了用該算法實現的入侵檢測系統模型.利用該
    發表于 06-13 11:01 ?18次下載

    結合SVM和KNN實現求解大規模復雜問題的分治算法

    針對于使用支持向量機求解大規模復雜問題存在訓練時間過長和分類精度不高等困難,本文提出了一種結合支持向量機(SVM)和K-最近鄰(KNN)分類的分治算法。首先對支持向量機分類
    發表于 01-15 16:12 ?16次下載

    蟻群算法實現求解TSP問題_郝春梅

    蟻群算法實現求解TSP問題_郝春梅
    發表于 03-19 11:45 ?0次下載

    結合LSH的KNN數據填補算法

    K近鄰(kNN算法是缺失數據填補的常用算法,但由于需要逐個計算所有記錄對之間的相似度,因此其填補耗時較高。為提高算法效率,提出結合局部敏感哈希( LSH)的
    發表于 12-23 10:57 ?0次下載

    人工智能機器學習之K近鄰算法KNN

    K近鄰KNN(k-Nearest Neighbor)算法,也叫K最近鄰算法,1968年由 Cover 和 Hart 提出,是機器學習算法中比較成熟的
    發表于 05-29 06:53 ?2795次閱讀

    詳解機器學習分類算法KNN

    本文主要介紹一個被廣泛使用的機器學習分類算法,K-nearest neighbors(KNN),中文叫K近鄰算法
    的頭像 發表于 10-31 17:18 ?6080次閱讀

    數據科學經典算法 KNN 已被嫌慢,ANN 比它快 380 倍

    - 近鄰算法非常簡單而有效,它的模型表示就是整個訓練數據集。就原理而言,對新數據點的預測結果是通過在整個訓練集上搜索與該數據點最相似的 K 個實例(近鄰)并且總結這 K 個實例的輸出變量而得出的。
    的頭像 發表于 01-02 09:08 ?7830次閱讀

    如何使用Arduino KNN庫進行簡單的機器學習?

    除了像TensorFlow for Arduino這樣強大的深度學習架構外,還有一些經典的ML方法適用于嵌入式設備上的較小數據集,這些方法有用且易于理解-最簡單的方法之一就是KNNKNN的一個
    的頭像 發表于 04-01 10:07 ?3533次閱讀
    如何使用Arduino <b class='flag-5'>KNN</b>庫進行<b class='flag-5'>簡單</b>的機器學習?

    通過Python腳本實現WIFI密碼的暴力破解

    本文將記錄學習下如何通過 Python 腳本實現 WIFI 密碼的暴力破解。
    的頭像 發表于 09-19 09:55 ?6662次閱讀

    【每天學點AI】KNN算法簡單有效的機器學習分類器

    過程,其實就是一個簡單的分類問題,而KNN(K-NearestNeighbors)算法正是模仿這種人類決策過程的機器學習算法。|什么是KNN
    的頭像 發表于 10-31 14:09 ?237次閱讀
    【每天學點AI】<b class='flag-5'>KNN</b><b class='flag-5'>算法</b>:<b class='flag-5'>簡單</b>有效的機器學習分類器