K-近鄰算法

Infi-chu:python

http://www.cnblogs.com/Infi-chu/算法

 

1、K-近鄰算法簡介數組

K-近鄰算法(KNN)是機器學習算法中一個較爲經典的算法bash

1.定義數據結構

若是一個樣本在特徵空間中的K個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本屬於這個類別機器學習

2.距離公式ide

兩個樣本的距離能夠經過歐式距離計算,以下圖所示:學習

2、Scikit-learn模塊測試

1.機器學習流程大數據

  • 獲取數據集
  • 數據基本處理
  • 特徵工程
  • 機器學習
  • 模型評估

 2.安裝

pip install scikit-learn

【注】須要Numpy和Scipy等庫支持

3.模塊包含的內容

  • 分類、聚類、迴歸
  • ’特徵工程
  • 模型選擇、調優

 4.K-近鄰算法API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
# n_neighbors:int,可選,默認=5

 

3、距離度量

1.歐式距離(Euclidean Distance)

歐氏距離是最容易直觀理解的距離度量方法,具體以下:

eg.

X=[[1,1],[2,2],[3,3],[4,4]];
經計算得:
d = 1.4142    2.8284    4.2426    1.4142    2.8284    1.4142

2.曼哈頓距離(manhattan Distance)

 在曼哈頓街區要從一個十字路口開車到另外一個十字路口,駕駛距離顯然不是兩點間的直線距離。這個實際駕駛距離就是「曼哈頓距離」。曼哈頓距離也稱爲「城市街區距離」(City Block distance)。

eg.

X=[[1,1],[2,2],[3,3],[4,4]];
經計算得:
d =   2     4     6     2     4     2

 

3.切比雪夫距離(Chebyshev Distance)

 國際象棋中,國王能夠直行、橫行、斜行,因此國王走一步能夠移動到相鄰8個方格中的任意一個。國王從格子(x1,y1)走到格子(x2,y2)最少須要多少步?這個距離就叫切比雪夫距離。

eg.

X=[[1,1],[2,2],[3,3],[4,4]];
經計算得:
d =   1     2     3     1     2     1

 

4.閔可夫斯基距離(Minkowski Distance)

 閔氏距離不是一種距離,而是一組距離的定義,是對多個距離度量公式的歸納性的表述。

其中p是一個變參數:

當p=1時,就是曼哈頓距離;

當p=2時,就是歐氏距離;

當p→∞時,就是切比雪夫距離。

根據p的不一樣,閔氏距離能夠表示某一類/種的距離。

【總結】

1 閔氏距離,包括曼哈頓距離、歐氏距離和切比雪夫距離都存在明顯的缺點:

eg. 二維樣本(身高[單位:cm],體重[單位:kg]),現有三個樣本:a(180,50),b(190,50),c(180,60)。

a與b的閔氏距離(不管是曼哈頓距離、歐氏距離或切比雪夫距離)等於a與c的閔氏距離。但實際上身高的10cm並不能和體重的10kg劃等號。

2.閔氏距離缺點

  • 將各個份量的量綱(scale),也就是「單位」相同的看待了
  • 爲考慮份量的分佈(指望、方差等)多是不一樣的

 

5.標準化歐氏距離(Standardized EuclideanDistance)

標準化歐氏距離是針對歐氏距離的缺點而做的一種改進。

思路:既然數據各維份量的分佈不同,那先將各個份量都「標準化」到均值、方差相等。假設樣本集X的均值(mean)爲m,標準差(standard deviation)爲s,X的「標準化變量」表示爲:

若是將方差的倒數當作一個權重,也可稱之爲加權歐氏距離(Weighted Euclidean distance)。

eg.

X=[[1,1],[2,2],[3,3],[4,4]];(假設兩個份量的標準差分別爲0.5和1)
經計算得:
d =   2.2361    4.4721    6.7082    2.2361    4.4721    2.2361

 

6.餘弦距離(Cosine Distance)

 幾何中,夾角餘弦可用來衡量兩個向量方向的差別;機器學習中,借用這一律念來衡量樣本向量之間的差別。

夾角餘弦取值範圍爲[-1,1]。餘弦越大表示兩個向量的夾角越小,餘弦越小表示兩向量的夾角越大。當兩個向量的方向重合時餘弦取最大值1,當兩個向量的方向徹底相反餘弦取最小值-1。

eg.

X=[[1,1],[1,2],[2,5],[1,-4]]
經計算得:
d =   0.9487    0.9191   -0.5145    0.9965   -0.7593   -0.8107

 

7.漢明距離(Hamming Distance)

 兩個等長字符串s1與s2的漢明距離爲:將其中一個變爲另一個所須要做的最小字符替換次數。

The Hamming distance between "1011101" and "1001001" is 2. 
The Hamming distance between "2143896" and "2233796" is 3. 
The Hamming distance between "toned" and "roses" is 3.

 

漢明重量:是字符串相對於一樣長度的零字符串的漢明距離,也就是說,它是字符串中非零的元素個數:對於二進制字符串來講,就是 1 的個數,因此 11101 的漢明重量是 4。所以,若是向量空間中的元素a和b之間的漢明距離等於它們漢明重量的差a-b。

應用:漢明重量分析在包括信息論、編碼理論、密碼學等領域都有應用。好比在信息編碼過程當中,爲了加強容錯性,應使得編碼間的最小漢明距離儘量大。可是,若是要比較兩個不一樣長度的字符串,不只要進行替換,並且要進行插入與刪除的運算,在這種場合下,一般使用更加複雜的編輯距離等算法。

eg.

X=[[0,1,1],[1,1,2],[1,5,2]]
注:如下計算方式中,把2個向量之間的漢明距離定義爲2個向量不一樣的份量所佔的百分比。

經計算得:
d =   0.6667    1.0000    0.3333

 

8.傑卡德距離(Jaccard Distance)

 傑卡德類似係數(Jaccard similarity coefficient):兩個集合A和B的交集元素在A,B的並集中所佔的比例,稱爲兩個集合的傑卡德類似係數,用符號J(A,B)表示:

傑卡德距離(Jaccard Distance):與傑卡德類似係數相反,用兩個集合中不一樣元素佔全部元素的比例來衡量兩個集合的區分度:

eg.

X=[[1,1,0][1,-1,0],[-1,1,0]]
注:如下計算中,把傑卡德距離定義爲不一樣的維度的個數佔「非全零維度」的比例
經計算得:
d =   0.5000    0.5000    1.0000

 

9.馬氏距離(Mahalanobis Distance)

 下圖有兩個正態分佈圖,它們的均值分別爲a和b,但方差不同,則圖中的A點離哪一個整體更近?或者說A有更大的機率屬於誰?顯然,A離左邊的更近,A屬於左邊整體的機率更大,儘管A與a的歐式距離遠一些。這就是馬氏距離的直觀解釋。

馬氏距離是基於樣本分佈的一種距離。

馬氏距離是由印度統計學家馬哈拉諾比斯提出的,表示數據的協方差距離。它是一種有效的計算兩個位置樣本集的類似度的方法。

與歐式距離不一樣的是,它考慮到各類特性之間的聯繫,即獨立於測量尺度。

馬氏距離定義:設整體G爲m維整體(考察m個指標),均值向量爲μ=(μ1,μ2,… ...,μm,)`,協方差陣爲∑=(σij),

則樣本X=(X1,X2,… …,Xm,)`與整體G的馬氏距離定義爲:

馬氏距離也能夠定義爲兩個服從同一分佈而且其協方差矩陣爲∑的隨機變量的差別程度:若是協方差矩陣爲單位矩陣,馬氏距離就簡化爲歐式距離;若是協方差矩陣爲對角矩陣,則其也可稱爲正規化的歐式距離。

馬氏距離特性:

1.量綱無關,排除變量之間的相關性的干擾;

2.馬氏距離的計算是創建在整體樣本的基礎上的,若是拿一樣的兩個樣本,放入兩個不一樣的整體中,最後計算得出的兩個樣本間的馬氏距離一般是不相同的,除非這兩個整體的協方差矩陣碰巧相同;

3 .計算馬氏距離過程當中,要求整體樣本數大於樣本的維數,不然獲得的整體樣本協方差矩陣逆矩陣不存在,這種狀況下,用歐式距離計算便可。

4.還有一種狀況,知足了條件整體樣本數大於樣本的維數,可是協方差矩陣的逆矩陣仍然不存在,好比三個樣本點(3,4),(5,6),(7,8),這種狀況是由於這三個樣本在其所處的二維空間平面內共線。這種狀況下,也採用歐式距離計算。

eg.

已知有兩個類G1和G2,好比G1是設備A生產的產品,G2是設備B生產的同類產品。設備A的產品質量高(如考察指標爲耐磨度X),其平均耐磨度μ1=80,反映設備精度的方差σ2(1)=0.25;設備B的產品質量稍差,其平均耐磨損度μ2=75,反映設備精度的方差σ2(2)=4.

今有一產品G0,測的耐磨損度X0=78,試判斷該產品是哪一臺設備生產的?

直觀地看,X0與μ1(設備A)的絕對距離近些,按距離最近的原則,是否應把該產品判斷設備A生產的?

考慮一種相對於分散性的距離,記X0與G1,G2的相對距離爲d1,d2,則:

 

由於d2=1.5 < d1=4,按這種距離準則,應判斷X0爲設備B生產的。

設備B生產的產品質量較分散,出現X0爲78的可能性較大;而設備A生產的產品質量較集中,出現X0爲78的可能性較小。

這種相對於分散性的距離判斷就是馬氏距離。

 

4、K值的選擇

1.K值過大

容易受到樣本均衡的問題

2.K值太小

容易受到異常點的影響

3.K值選擇

  • 選擇較小的K值,就至關於用較小的領域中的訓練實例進行預測,「學習」近似偏差會減少,只有與輸入實例較近或類似的訓練實例纔會對預測結果起做用,與此同時帶來的問題是「學習」的估計偏差會增大,換句話說,K值的減少就意味着總體模型變得複雜,容易發生過擬合;
  • 選擇較大的K值,就至關於用較大領域中的訓練實例進行預測,其優勢是能夠減小學習的估計偏差,但缺點是學習的近似偏差會增大。這時候,與輸入實例較遠(不類似的)訓練實例也會對預測器做用,使預測發生錯誤,且K值的增大就意味着總體的模型變得簡單。
  • K=N(N爲訓練樣本個數),則徹底不足取,由於此時不管輸入實例是什麼,都只是簡單的預測它屬於在訓練實例中最多的類,模型過於簡單,忽略了訓練實例中大量有用信息。

在實際應用中,K值通常取一個比較小的數值,例如採用交叉驗證法(簡單來講,就是把訓練數據在分紅兩組:訓練集和驗證集)來選擇最優的K值。對這個簡單的分類器進行泛化,用核方法把這個線性模型擴展到非線性的狀況,具體方法是把低維數據集映射到高維特徵空間。

4.近似偏差

對現有訓練集的訓練偏差,關注訓練集,若是近似偏差太小可能會出現過擬合的現象,對現有的訓練集能有很好的預測,可是對未知的測試樣本將會出現較大誤差的預測。模型自己不是最接近最佳模型。

5.估計偏差

 能夠理解爲對測試集的測試偏差,關注測試集,估計偏差小說明對未知數據的預測能力好,模型自己最接近最佳模型。

 

 5、kd樹

1.kd樹

根據KNN每次須要預測一個點時,咱們都須要計算訓練數據集裏每一個點到這個點的距離,而後選出距離最近的k個點進行投票。當數據集很大時,這個計算成本很是高,針對N個樣本,D個特徵的數據集,其算法複雜度爲O(DN^2)

kd樹:爲了不每次都從新計算一遍距離,算法會把距離信息保存在一棵樹裏,這樣在計算以前從樹裏查詢距離信息,儘可能避免從新計算。其基本原理是,若是A和B距離很遠,B和C距離很近,那麼A和C的距離也很遠。有了這個信息,就能夠在合適的時候跳過距離遠的點。這樣優化後的算法複雜度可下降到O(DNlog(N))

2.原理

黃色的點做爲根節點,上面的點歸左子樹,下面的點歸右子樹,接下來再不斷地劃分,分割的那條線叫作分割超平面(splitting hyperplane),在一維中是一個點,二維中是線,三維的是面。

黃色節點就是Root節點,下一層是紅色,再下一層是綠色,再下一層是藍色。

3.步驟

1.樹的創建;

2.最近鄰域搜索(Nearest-Neighbor Lookup)

kd樹(K-dimension tree)是一種對k維空間中的實例點進行存儲以便對其進行快速檢索的樹形數據結構。kd樹是一種二叉樹,表示對k維空間的一個劃分,構造kd樹至關於不斷地用垂直於座標軸的超平面將K維空間切分,構成一系列的K維超矩形區域。kd樹的每一個結點對應於一個k維超矩形區域。利用kd樹能夠省去對大部分數據點的搜索,從而減小搜索的計算量。

類比「二分查找」:給出一組數據:[9 1 4 7 2 5 0 3 8],要查找8。若是挨個查找(線性掃描),那麼將會把數據集都遍歷一遍。而若是排一下序那數據集就變成了:[0 1 2 3 4 5 6 7 8 9],按前一種方式咱們進行了不少沒有必要的查找,如今若是咱們以5爲分界點,那麼數據集就被劃分爲了左右兩個「簇」 [0 1 2 3 4]和[6 7 8 9]。

所以,根本就沒有必要進入第一個簇,能夠直接進入第二個簇進行查找。把二分查找中的數據點換成k維數據點,這樣的劃分就變成了用超平面對k維空間的劃分。空間劃分就是對數據點進行分類,「捱得近」的數據點就在一個空間裏面。

4.構造方法

(1)構造根結點,使根結點對應於K維空間中包含全部實例點的超矩形區域;

(2)經過遞歸的方法,不斷地對k維空間進行切分,生成子結點。在超矩形區域上選擇一個座標軸和在此座標軸上的一個切分點,肯定一個超平面,這個超平面經過選定的切分點並垂直於選定的座標軸,將當前超矩形區域切分爲左右兩個子區域(子結點);這時,實例被分到兩個子區域。

(3)上述過程直到子區域內沒有實例時終止(終止時的結點爲葉結點)。在此過程當中,將實例保存在相應的結點上。

(4)一般,循環的選擇座標軸對空間切分,選擇訓練實例點在座標軸上的中位數爲切分點,這樣獲得的kd樹是平衡的(平衡二叉樹:它是一棵空樹,或其左子樹和右子樹的深度之差的絕對值不超過1,且它的左子樹和右子樹都是平衡二叉樹)。

KD樹中每一個節點是一個向量,和二叉樹按照數的大小劃分不一樣的是,KD樹每層須要選定向量中的某一維,而後根據這一維按左小右大的方式劃分數據。在構建KD樹時,關鍵須要解決2個問題:

(1)選擇向量的哪一維進行劃分;

(2)如何劃分數據;

第一個問題簡單的解決方法能夠是隨機選擇某一維或按順序選擇,可是更好的方法應該是在數據比較分散的那一維進行劃分(分散的程度能夠根據方差來衡量)。好的劃分方法可使構建的樹比較平衡,能夠每次選擇中位數來進行劃分,這樣問題2也獲得瞭解決。

 

6、特徵工程——特徵預處理

1.爲何要進行歸一化/標準化處理

特徵的單位或者大小相差較大,或者某特徵的方差相比其餘的特徵要大出幾個數量級容易影響(支配)目標結果,使得一些算法沒法學習到其它的特徵,須要用到一些方法進行無量綱化使不一樣規格的數據轉換到同一規格

2.包含內容(數值型數據的無量綱化)

  • 標準化
  • 歸一化

3.特徵預處理API

sklearn.preprocessing

 

7、歸一化

1.定義

經過對原始數據進行變換把數據映射到(默認爲[0,1])之間

2.公式

 

3.API

sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )

  • MinMaxScalar.fit_transform(X)
    • X:numpy array格式的數據[n_samples,n_features]
  • 返回值:轉換後的形狀相同的array

 4.總結

 注意最大值最小值是變化的,另外,最大值與最小值很是容易受異常點影響,因此這種方法魯棒性較差,只適合傳統精確小數據場景。

 

8、標準化

1.定義

經過對原始數據進行變換把數據變換到均值爲0,標準差爲1範圍內

2.公式

  • 對於歸一化來講:若是出現異常點,影響了最大值和最小值,那麼結果顯然會發生改變
  • 對於標準化來講:若是出現異常點,因爲具備必定數據量,少許的異常點對於平均值的影響並不大,從而方差改變較小。

3.API

sklearn.preprocessing.StandardScaler( )

  • 處理以後每列來講全部數據都彙集在均值0附近標準差差爲1
  • StandardScaler.fit_transform(X)
    • X:numpy array格式的數據[n_samples,n_features]
  • 返回值:轉換後的形狀相同的array

4.總結

在已有樣本足夠多的狀況下比較穩定,適合現代嘈雜大數據場景。

 

9、交叉驗證

1.定義

交叉驗證:將拿到的訓練數據,分爲訓練和驗證集。如下圖爲例:將數據分紅4份,其中一份做爲驗證集。而後通過4次(組)的測試,每次都更換不一樣的驗證集。即獲得4組模型的結果,取平均值做爲最終結果。又稱4折交叉驗證。

爲了讓從訓練獲得模型結果更加準確。作如下處理:

  • 訓練集:訓練集+驗證集
  • 測試集:測試集

2.目的

交叉驗證目的:爲了讓被評估的模型更加準確可信

 

10、網格搜索

1.定義

一般狀況下,有不少參數是須要手動指定的(如k-近鄰算法中的K值),這種叫超參數。可是手動過程繁雜,因此須要對模型預設幾種超參數組合。每組超參數都採用交叉驗證來進行評估。最後選出最優參數組合創建模型。

2.交叉驗證、網格搜索API

sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

  • 對估計器的指定參數值進行詳盡搜索
  • estimator:估計器對象
  • param_grid:估計器參數(dict){「n_neighbors」:[1,3,5]}
  • cv:指定幾折交叉驗證
  • fit:輸入訓練數據
  • score:準確率
  • 結果分析:
    • bestscore__:在交叉驗證中驗證的最好結果
    • bestestimator:最好的參數模型
    • cvresults:每次交叉驗證後的驗證集準確率結果和訓練集準確率結果
相關文章
相關標籤/搜索