1. 程式人生 > >機器學習回顧篇(6):KNN演算法

機器學習回顧篇(6):KNN演算法

 

1 引言¶

 

本文將從演算法原理出發,展開介紹KNN演算法,並結合機器學習中常用的Iris資料集通過程式碼例項演示KNN演算法用法和實現。

 

2 演算法原理¶

 

KNN(kNN,k-NearestNeighbor)演算法,或者說K近鄰演算法,應該算是機器學習中眾多分類演算法最好理解的一個了。古語有云:物以類聚,人以群分。沒錯,KNN演算法正是這一思想為核心,對資料進行分類。

而所謂K近鄰,意思是對於每一個待分類樣本,都可以以與其最近的K個樣本點的多數分類來來進行劃分。舉個例子,辦公室新來了一個同事,他的位置邊上坐著的10個(K=10)同事都是大多是Python程式設計師,我們會猜測這個新同事是Python程式設計師;如果把判斷依據擴大的整個辦公室,假設辦公室有50個人(K=50),其中java程式設計師35個,那麼我們就會認為這個新同事是java程式設計師。

回到KNN演算法,對資料進行分類的思想和流程與我們判斷新同事的工作是一樣的:

(1)計算待分類樣本與所有已知分類的樣本之間的距離;

(2)對多有距離進行按升序排序;

(3)取前K個樣本;

(4)統計前K個樣本中各分類出現的頻數;

(5)將待分類樣本劃分到頻數最高的分類中。

好了,我想現在你應該對KNN演算法有了基本的認識了。不過有幾個問題還得明確一下:

K值如何確定?

如何度量距離?

先來說說如何確定K值。對於K值,從KNN演算法的名稱中,我們可以看出K值得重要性是毋庸置疑的。我們用下圖的例子來說一說K值得樣本分類的重要性: 圖中所有圓點構成一個數據集,圓點顏色代表分類,那麼,圖中無色圓點劃分到哪個類呢?

當K=1時,離透明點最近的點是藍點,那麼我們應該將透明圓點劃分到藍點所在類別中;

當K=5時,離透明點最近的5個點中有4個紅點,1個藍點,那麼我們應該將透明圓點劃分到紅點所屬的類別中;

當K=10時,離透明點最近的10個點中有4個紅點,6個藍點,那麼我們應該將透明圓點劃分到藍點所屬的類別中。

你看,最終的結果因K值而異,K值過大過小都會對資料的分類產生不同程度的影響:

當K取較小值時,意味著根據與待測樣本距離較小的小範圍內樣本對待測樣本的類別進行預測,這麼做的優點是較遠範圍的樣本資料不會對分類結果產生影響,訓練誤差(機器學習模型在訓練資料集上表現出的誤差叫做訓練誤差)較小。但卻容易導致過擬合現象的產生,增大泛化誤差(在任意一個測試資料樣本上表現出的誤差的期望值叫做泛化誤差)模型變得複雜,一旦帶測驗本附近有異常資料存在,分類經過就可能會產生較大的影響,例如上圖上K=1時,如果最近的藍點是異常資料,那麼對透明圓點的預測結果就因此變得異常。

當K較大值時,意味著綜合更大範圍的樣本對待測驗本類別進行預測,優點是可以減少泛化誤差,但訓練誤差隨之增大,模型變得簡單。一個極端的例子就是如上圖所示,當K取值為整個資料集規模時,整個預測過程就沒有太大價值,所有待測樣本類別都會被預測為資料集中樣本數量多的一類。

對於K值的確定,目前並沒有專門的理論方案,一個較普遍的做法就是將資料集分為兩部分,一部分用作訓練集,一部分用作測試集,從K取一個較小值開始,逐步增加K值,最終去準確率最高的一個K值。

一般而言,K取值不超過20,上限是n的開方,隨著資料集的增大,K的值也要增大。另外,K的取值儘量要取奇數,以保證在計算結果最後會產生一個較多的類別,如果取偶數可能會產生相等的情況,不利於預測。

關於距離度量,我們最熟悉的、使用最廣泛的就是歐式距離了。對於$d$維資料點$x$和$y$之間的歐氏距離定義為: $$E(x,y) = \sqrt {\sum\limits_{i = 0}^d {{{({x_i} - {y_i})}^2}} } $$

除了歐氏距離外,距離度量方法還有餘弦距離、哈曼頓距離、切比雪夫距離等,但使用不多,不介紹了。

最後總結一下KNN演算法:

KNN的主要優點有:

1) 理論成熟,思想簡單,既可以用來做分類也可以用來做迴歸

2) 可用於非線性分類

3) 和樸素貝葉斯之類的演算法比,對資料沒有假設,準確度高,對異常點不敏感

4) 由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合

5)該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分

KNN的主要缺點有:

1)計算量大,尤其是特徵數非常多的時候

2)樣本不平衡的時候,對稀有類別的預測準確率低

3)使用懶散學習方法,基本上不學習,導致預測時速度比起邏輯迴歸之類的演算法慢

4)相比決策樹模型,KNN模型可解釋性不強

 

3 Python實現KNN演算法¶

 

我們用Python來手動實現KNN演算法,採用的資料集為Iris資料集,可以從UCI官網上下載,然後放到當前目錄下:

In [2]:
# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.utils import shuffle
In [5]:
# 讀取資料,並指定列名
names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class_name']  # 為每列指定一個列名
iris_data = pd.read_csv('iris.data',names=names)
 

檢視一下資料的基本情況:

In [ ]:
iris_data.describe().T
 

 

可以看到,各屬性均值、值域各不相同,為了消除各屬性因為取值範圍的不同對演算法的不良影響,最好對資料進行歸一化:

In [6]:
# 資料歸一化
for col in names[:-1]:
    clo_max = iris_data[col].max()
    clo_min = iris_data[col].min()
    iris_data[col] = (iris_data[col] - clo_min) / (clo_max - clo_min)
In [ ]:
iris_data.head(10)
 

 

源資料集是根據樣本類別進行排序的,所以需要先打亂資料:

In [ ]:
iris_data = shuffle(iris_data)  # 打亂資料
iris_data = iris_data.reset_index(drop=True)  # 重設索引
iris_data.head(10)
 

相關推薦

機器學習回顧6KNN演算法

  1 引言¶   本文將從演算法原理出發,展開介紹KNN演算法,並結合機器學習中常用的Iris資料集通過程式碼例項演示KNN演算法用法和實現。

機器學習回顧16蒙特卡洛演算法

          蒙特卡羅(MC,Monte Carlo)方法是一種隨機取樣模擬求解的方法,又被稱統計試驗方法或者統計模擬方法。起初,蒙特卡羅方法的提出是20世紀40年代馮·諾伊曼,

機器學習回顧2最小二乘法

1 引言 在機器學習常用的優化演算法中,梯度下降法和最小二乘法佔盡了風騷。梯度下降法上一篇中已經詳細介紹過了,那麼這一篇,我們繼續說一說最小二乘法。 2 什麼是最小二乘法 描述預測模型準確程度有多重不同的方法: (1)誤差和最小化。這種方法存在的問題是正負誤差會相互抵消,導致描述不準確。 (2)誤差

機器學習回顧4邏輯迴歸

1 引言 邏輯不邏輯,迴歸非迴歸。 回想當年初次學習邏輯迴歸演算法時,看到”邏輯迴歸“這個名字,第一感覺是這是一個與線性迴歸類似的迴歸類別的演算法,只不過這個演算法突出”邏輯“,或者與某個以”邏輯“命名的知識點有關。可後來卻發現,這是

機器學習回顧5樸素貝葉斯演算法

1 引言 說到樸素貝葉斯演算法,很自然地就會想到貝葉斯概率公式,這是我們在高中的時候就學過的只是,沒錯,這也真是樸素貝葉斯演算法的核心,今天我們也從貝葉斯概率公式開始,全面擼一擼樸素貝葉斯演算法。 2 貝葉斯概率公式 2.1 聯合概率與全概率公式 定義1:完備事件組 ${A_1} \cup {A_2

機器學習回顧7決策樹演算法ID3、C4.5

  注:本系列所有部落格將持續更新併發布在github上,您可以通過github下載本系列所有文章筆記檔案。   1 演算法概述¶

機器學習回顧8CART決策樹演算法

注:本系列所有部落格將持續更新併發布在github和gitee上,您可以通過github、gitee下載本系列所有文章筆記檔案。 1 引言 上一篇部落格中介紹了ID3和C4.5兩種決策樹演算法,這兩種決策樹都只能用於分類問題,而本文要說的CART(classification and regression

機器學習回顧10感知機模型

  注:本系列所有部落格將持續更新併發布在github和gitee上,您可以通過github、gitee下載本系列所有文章筆記檔案。   1 引言¶ 感知機是一種簡單且易於實現的二分類判別模型,主要思想是通過誤分類

機器學習回顧11支援向量機SVM

  1. 引言¶ SVM,Support Vector Machine,也就是我們中文名的支援向量機,我相信,只要是與機器學習有過照面的童鞋或多或少都聽說過這個名字。作為機器學習家族中的老牌成員,其經典自不必說。從原理和特性上講,SVM

機器學習回顧12整合學習之Bagging與隨機森林

  1 引言¶ 整合學習演算法是當下炙手可熱的一類演算法,在諸多機器學習大賽中都頻繁出現它的身影。準確來說,整合學習演算法並不是一個單獨的機器學習演算法,而是通過構建多個學習器,博採眾家之長,共同求解問題的一種思想。古語有云:&ldquo

機器學習回顧13整合學習之AdaBoost

  在上一篇部落格中,我們總結了整合學習的原理,並展開介紹了整合學習中Bagging和隨機森林這一分枝演算法,在本篇部落格中,我們繼續介紹另一個分枝——Boosting,並對Boosting系列中的經典演算法Adaboost

機器學習回顧14主成分分析法PCA

  1 引言¶ 在展開資料分析工作時,我們經常會面臨兩種困境,一種是原始資料中特徵屬性太少,“巧婦難為無米之炊”,很難挖掘出潛在的規律,對於這種情況,我們只能在收集這一環節上多下功夫;另一種困境剛好相反,那就是特徵

機器學習回顧15整合學習之GDBT

          1 引言¶ 梯度提升樹演算法(Gradient Boosting Decision Tree,GBDT)是一個非常經典的機器學習演算法,和我們前面介紹過的Adaboost演算法一樣,都是提

機器學習實戰教程線性回歸基礎

學習 reg style spa 目標 pub auto 機器 輸入 一 什麽是回歸?   回歸的目的是預測數值型的目標值,最直接的辦法是依據輸入,寫入一個目標值的計算公式。   假如你想預測小姐姐男友汽車的功率,可能會這麽計算:               Ho

機器學習實戰教程決策樹實戰之為自己配個隱形眼鏡

原文連結:cuijiahua.com/blog/2017/1… 一、前言 上篇文章機器學習實戰教程(二):決策樹基礎篇之讓我們從相親說起講述了機器學習決策樹的原理,以及如何選擇最優特徵作為分類特徵。本篇文章將在此基礎上進行介紹。主要包括: 決策樹構建 決策樹視覺化 使用決

機器學習實戰教程樸素貝葉斯實戰之新浪新聞分類

原文連結: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_5_bayes_2.html 一、前言 上篇文章機器學習實戰教程(四):樸素貝葉斯基礎篇之言論過濾器講解了樸素貝葉斯的基礎知識。本篇文章將在此基礎上進行擴充套件,你將看到以下內容: 拉普拉

機器學習實戰教程樸素貝葉斯基礎之言論過濾器

word 最可 dog 一個 mac github上 開課 和數 基礎上 原文鏈接: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_4_bayes_1.html 一、前言 樸素貝葉斯算法是有監督的學習算法,解決的是分類問題,

學習OpenStack之6Neutron 深入學習之 OVS + GRE 之 Compute node

0.環境 OpenStack網路配置:一個tenant, 2個虛機 Type driver: GRE, Mechanism driver: OVS 一個public network: ext-net 和相應的subnet ext-subnet 一個VM network:demo-net 和相應

深入理解java虛擬機器系列初為什麼要學習JVM?

前言 本來想著關於寫JVM這個專欄,直接寫知識點乾貨的,但是想著還是有必要開篇講一下為什麼要學習JVM,這樣的話讓一些學習者心裡有點底的感覺比較好... 原因一:面試 不得不說,隨著網際網路門檻越來越高,JVM知識也是中高階程式設計師階段必問的一個話題!現在不像以前了,以前會點html都好找工作,現在由於學習

中國mooc北京理工大學機器學習第二周分類

kmeans 方法 輸入 nump arr mod 理工大學 each orm 一、K近鄰方法(KNeighborsClassifier) 使用方法同kmeans方法,先構造分類器,再進行擬合。區別是Kmeans聚類是無監督學習,KNN是監督學習,因此需要劃分出訓練集和測試