機器學習算法之KNN

前言

KNN一般用于有監督的分類場景,除此之外,KNN在異常檢測場景中也有應用,下面主要介紹下KNN在這兩面的應用原理。

KNN做分類的原理

計算步驟如下:
1)算距離:給定測試對象,計算它與訓練集中的每個對象的距離
2)找鄰居:圈定距離最近的k個訓練對象,作為測試對象的近鄰
3)做分類:根據這k個近鄰歸屬的主要類別,來對測試對象分類
(看未知類別樣本最近的K個樣本的類別,那種類別多,樣本就屬于那種類別!)

優缺點

KNN優點:

  1. 理論成熟,思想簡單,既可以用來做分類也可以用來做回歸
  2. 可用于非線性分類
  3. 訓練時間復雜度比支持向量機之類的算法低,僅為O(n)
  4. 和樸素貝葉斯之類的算法比,對數據沒有假設,準確度高,對異常點不敏感
  5. 由于KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對于類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合
  6. 該算法比較適用于樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域采用這種算法比較容易產生誤分

KNN 缺點

  1. 計算量大,尤其是特征數非常多的時候
  2. 樣本不平衡的時候,對稀有類別的預測準確率低
  3. KD樹,球樹之類的模型建立需要大量的內存
  4. 使用懶散學習方法,基本上不學習,導致預測時速度比起邏輯回歸之類的算法慢
  5. 相比決策樹模型,KNN模型可解釋性不強(雞蛋里挑骨頭了)

適用場景

它的適用面很廣,并且在樣本量足夠大的情況下準確度很高。不適用于特征維度比較多的場景(幾十維即可)

參數詳解

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None, **kwargs)

常用參數:algorithm、n_neighbors、weights、p 等超參數
第一個超參數:algorithm(一般設為auto即可)
algorithm 即建立 kNN 模型時采用什么算法去搜索最近的 k 個點,有四個選項:

  • brute(暴力搜索)
  • kd_tree(KD樹)
  • ball_tree(球樹)
  • auto(默認值,自動選擇上面三種速度最快的)

之前建立模型時沒有設置這個參數,模型默認使用了 auto 方法,不過還是有必要了解一下這幾種方法的區別。
首先,我們知道 KNN 模型的核心思想是計算大量樣本點之間的距離。
第一種算法 brute (暴力搜索)。意思就是計算預測樣本和全部訓練集樣本的距離,最后篩選出前 K 個最近的樣本,這種方法很蠻力,所以叫暴力搜索。當樣本和特征數量很大的時候,每計算一個樣本距離就要遍歷一遍訓練集樣本,很費時間效率低下。有什么方法能夠做到無需遍歷全部訓練集就可以快速找到需要的 k 個近鄰點呢?這就要用到 KD 樹和球樹算法。

第二種算法 KD 樹(K-dimension tree縮寫)。簡單來說 KD 樹是一種「二叉樹」結構,就是把整個空間劃分為特定的幾個子空間,然后在合適的子空間中去搜索待預測的樣本點。采用這種方法不用遍歷全部樣本就可以快速找到最近的 K 個點,速度比暴力搜索快很多(稍后會用實例對比一下)。至于什么是二叉樹,這就涉及到數據結構的知識,稍微有些復雜,就目前來說暫時不用深入了解,sklearn 中可以直接調用 KD 樹,很方便。
假設數據集樣本數為 m,特征數為 n,則當樣本數量 m 大于 2 的 n 次方時,用 KD 樹算法搜索效果會比較好。比如適合 1000 個樣本且特征數不超過 10 個(2 的 10 次方為 1024)的數據集。一旦特征過多,KD 樹的搜索效率就會大幅下降,最終變得和暴力搜索差不多。通常來說 KD 樹適用維數不超過 20 維的數據集,超過這個維數可以用球樹這種算法。

第三種算法是球樹(Ball tree)。對于一些分布不均勻的數據集,KD 樹算法搜索效率并不好,為了優化就產生了球樹這種算法。同樣的,暫時先不用具體深入了解這種算法。
當數據集樣本數量 m > 2 的 n 次方時,kd_tree 和 ball_tree 速度比 brute 暴力搜索快了一個量級,auto 采用其中最快的算法。
我們介紹了第一個超參數 algorithm,就 kNN 算法來說通常只需要設置 auto 即可,讓模型自動為我們選擇合適的算法。

第二個超參數:n_neighbors
n_neighbors 即要選擇最近幾個點,默認值是 5(等效 k )。

k值過大和過小造成的影響:
k值較小,就相當于用較小的領域中的訓練實例進行預測,訓練誤差近似誤差小(偏差小),泛化誤差會增大(方差大),換句話說,K值較小就意味著整體模型變得復雜,容易發生過擬合;

k值較大,就相當于用較大領域中的訓練實例進行預測,泛化誤差小(方差小),但缺點是近似誤差大(偏差大),換句話說,K值較大就意味著整體模型變得簡單,容易發生欠擬合;一個極端是k等于樣本數m,則完全沒有分類,此時無論輸入實例是什么,都只是簡單的預測它屬于在訓練實例中最多的類,模型過于簡單。

對于k值的選擇,沒有一個固定的經驗(sklearn默認為5),一般根據樣本的分布,選擇一個較小的值,可以通過交叉驗證選擇一個合適的k值。

第三個超參數:距離權重 weights
剛才在劃分黃色點分類時,最近的 3 個點中紅綠色點比例是 2:1,所以我們就把黃色點劃分為紅色點了。
在這里插入圖片描述
這樣做忽略了點與點之間的距離問題:雖然紅點數量多于綠點,但顯然綠點距離黃點更近,把黃點劃分為綠色類可能更合適。因此,之前的模型效果可能并不好。
所以,在建立模型時,還可以從距離出發,將樣本權重與距離掛鉤,近的點權重大,遠的點權重小。怎么考慮權重呢,可以用取倒數這個簡單方法實現。
以上圖為例,綠點距離是 1,取倒數權重還為 1;兩個紅點的距離分別是 3 和 4,去倒數相加后紅點權重和為 7/12。綠點的權重大于紅點,所以黃點屬于綠色類。
在 Sklearn 的 kNN 模型中有專門考慮權重的超參數:weights,它有兩個選項:
Uniform:不考慮距離權重,默認值
Distance:考慮距離權重

第四個超參數:p
說到距離,還有一個重要的超參數 p。
如果還記得的話,之前的模型在計算距離時,采用的是歐拉距離:
在這里插入圖片描述
在這里插入圖片描述
除了歐拉距離,還有一種常用的距離,曼哈頓距離:
在這里插入圖片描述
這兩種距離很好理解,舉個例子,從家到公司,歐拉距離就是二者的直線距離,但顯然不可能以直線到公司,而只能按著街道線路過去,這就是曼哈頓距離,俗稱出租車距離。
在這里插入圖片描述
這兩種格式很像,其實他們有一個更通用的公式:
在這里插入圖片描述
這就是明可夫斯基距離(Minkowski Distance),曼哈頓距離和歐拉距離分別是 p 為 1 和 2 的特殊值。
使用不同的距離計算公式,點的分類很可能不一樣導致模型效果也不一樣。

在 Sklearn 中對應這個距離的超參數是 p,默認值是 2,也就是歐拉距離。

KNN用作異常點檢測的原理

在這里插入圖片描述

比較簡單的做法是計算預測數據點與最近的K個樣本點的距離和,然后根據閾值進行異常樣本的判別(如若假設異常樣本量占總樣本量的1%,那么對數據集中每個數據點得到的距離和進行排序,挑選出Top1%即為異常值)。
K近鄰距離有多種設置:
1.距離第k近的點的距離
2.距離最近的k個點的平均距離
3.距離最近的k個點中的中間距離

PS:
這類方法有一種明顯的缺點,如果異常樣本數據較多,并且單獨成簇的話,最后得到的結果則不太樂觀。

KNN用于回歸的原理

1、計算已知點和未知點(待預測的樣本)的距離;
2、將訓練集樣本數據按照距離升序排序;
3、取其中最近的topK個值;
4、取平均;
5、得到樣本的預測值.

其他

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456315.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456315.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456315.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Supermap 組合單值專題圖與標簽專題圖演示樣例

效果圖例如以下&#xff1a;單值專題圖并顯示每一個區域的相關文字信息 代碼&#xff1a; <!DOCTYPE> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>單值專題圖</title>…

[劍指Offer] 25.復雜鏈表的復制

1 /*2 struct RandomListNode {3 int label;4 struct RandomListNode *next, *random;5 RandomListNode(int x) :6 label(x), next(NULL), random(NULL) {7 }8 };9 */ 10 class Solution 11 { 12 public: 13 //在舊鏈表中創建新鏈表&#xff0…

Flask項目中應用七牛云存儲

七牛云存儲&#xff1a; https://developer.qiniu.com/kodo/sdk/1242/python 點擊注冊開通七牛開發者帳號 如果已有賬號&#xff0c;直接登錄七牛開發者后臺&#xff0c;點擊這里查看 Access Key 和 Secret Key pip install qiniu q Auth(Access Key,Secret Key) b…

異常檢測算法之IForest

前言 IForest即孤立森林&#xff0c;可以用于做異常檢測。一句話總結IForest做異常檢測的原理&#xff1a;異常點密度小&#xff0c;基于樹模型容易被一下切割出來&#xff0c;正常值密度大&#xff0c;需要切割多次才能得到目標值。 原理 iForest算法得益于隨機森林的思想&…

JavaScript - 動態數據

1、使用ajax進行數據的請求 function getData(params){$.ajax({type: "POST", //提交方式data: "{params}", //請求參數url:, //請求接口contentType: "application/text;charsetutf-8",async: false, //是否同步dataType: &quo…

用c#編寫爬蟲在marinetraffic下載船僅僅圖片

近期在做船僅僅識別方面的事情&#xff0c;須要大量的正樣本來訓練adaboost分類器。于是到marinetraffic這個站點上下載船僅僅圖片。寫個爬蟲來自己主動下載顯然非常方便。 站點特點 在介紹爬蟲之前首先了解一下marinetraffic這個站點的一些特點&#xff1a; 1. 會定期檢測爬蟲…

發送手機驗證碼通過調用第三方網易云信API(flask項目)

一、 獲取驗證碼&#xff1a; 1. 輸入手機號碼 2. 通過ajax發送請求 3. 后端&#xff1a; 獲取手機號碼 使用requests向第三方的服務端&#xff08;網易云信&#xff09;發送請求 官方文檔 https://dev.yunxin.163.com/docs/product/%E7%9F%AD%E4%BF%A1/%E7%9F…

異常檢測算法之LOF

前言&#xff1a; LOF&#xff1a;Local outlier factor&#xff0c;即局部異常因子。LOF主要是通過比較每個點p和其鄰域點的密度來判斷該點是否為異常點&#xff0c;如果點p的密度越低&#xff0c;越可能被認定是異常點。至于密度&#xff0c;是通過點之間的距離來計算的&…

Android屬性動畫進階用法

2019獨角獸企業重金招聘Python工程師標準>>> 在上周二文章中介紹補間動畫缺點的時候有提到過&#xff0c;補間動畫是只能對View對象進行動畫操作的。而屬性動畫就不再受這個限制&#xff0c;它可以對任意對象進行動畫操作。那么大家應該還記得之前我舉的一個例子&am…

5.3linux下C語言socket網絡編程簡例

原創文章&#xff0c;轉載請注明轉載字樣和出處&#xff0c;謝謝&#xff01; 這里給出在Linux下的簡單socket網絡編程的實例&#xff0c;使用tcp協議進行通信&#xff0c;服務端進行監聽&#xff0c;在收到客戶端的連接后&#xff0c;發送數據給客戶端&#xff1b;客戶端在接受…

parser.add_argument驗證格式

article_bp Blueprint(article, __name__, url_prefix/api) api Api(article_bp) parser reqparse.RequestParser() parser.add_argument(name, typestr, help必須填寫名稱, requiredTrue) channel_fields { id: fields.Integer, cname: fields.String } clas…

異常檢測算法之HBOS

前言 HBOS&#xff08;Histogram-based Outlier Score&#xff09;核心思想&#xff1a;將樣本按照特征分成多個區間&#xff0c;樣本數少的區間是異常值的概率大。 原理 該方法為每一個樣本進行異常評分&#xff0c;評分越高越可能是異常點。評分模型為&#xff1a; 假設樣…

字典和json 的區別 和轉換

前言&#xff1a;字典和json非常像。接下來比較一下兩者的異同 先看一下字典的寫法&#xff1a; a {a:1,b:2,c:3} 再看一下json的寫法&#xff1a; {"studentInfo":{"id":123456,"stu_name":"Dorra"} } 從形式上看&#xff0c;都是…

Struts2的工作原理及工作流程

眾所周知&#xff0c;Struts2是個非常優秀的開源框架&#xff0c;我們能用Struts2框架進行開發&#xff0c;同時能 快速搭建好一個Struts2框架&#xff0c;但我們是否能把Struts2框架的工作原理用語言表達清楚&#xff0c;你表達的原理不需要說出底層是怎么實現的&#xff0c;我…

正則表達式采坑

[a-zA-Z]匹配大小寫字符 \w 匹配字母、數字、下劃線 {5,7} 表示前面的字符&#xff08;即&#xff1a;\w&#xff09;必須至少出現 5 次最多出現 7 次. 合起來就是 >6 少于8個的字符 [a-zA-Z]\w{6,12} --------------》》 就是要輸入七位數到十三位&#x…

easyui動態顯示和隱藏表頭

為什么80%的碼農都做不了架構師&#xff1f;>>> var _bt{date:日期,subtime:填寫時間,xz:小組,uname:操作人,qdbh:渠道編號,mt:媒體,zh:賬戶,sjd:時間段,tfwz:投放位置,tfh:投放號,td:團隊,sjje:實際金額,jxs:進線數,cb:成本,yxzyjx:有效資源進線,yxzyl:有效資源率…

物聯網

如果要說未來什么技術正在或將徹底改變人類生活、工作和娛樂的方式&#xff0c;那必須是物聯網。小到各種可穿戴產品&#xff0c;大到汽車、工廠和樓宇&#xff0c;物聯網能使一切設備互聯并具備智慧。物聯網也正改變著產業的格局&#xff0c;索尼、夏普、東芝等日本傳統電子設…

理解:復雜度是O(log^n) 就是二分法

冒昧問一下&#xff0c;為什么二分法查找的復雜度是O(log^n)&#xff1f;這是怎么計算的&#xff1f; 你要從1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8里面找到3&#xff0c;分成幾步&#xff1f; 第一步&#xff0c;…

淺談管理數據平臺的一些想法

前言&#xff1a; 對于任何使用大數據技術的公司來說&#xff0c;大數據平臺特別是Hive來說&#xff0c;維護其高效快速的運行&#xff0c;對整個公司的運作來說至關重要。比如說&#xff1a;某個調度任務失敗了造成業務部門的某些報表無法正常產出&#xff1b;hive平臺最近速…

MongoDB誤刪表恢復

一、場景描述公司某工程師執行db.giveget_card.drop()&#xff0c;誤將線上表刪除。幸好每天都有做備份&#xff0c;這個時候就體現了備份的重要性了&#xff0c;哈哈哈。。。二、模擬故障過程備份數據大小&#xff1a;rs_test01:PRIMARY> use ycsb switched to db ycsb rs_…