一.演算法概要
最簡單最初級的分類器是將全部的訓練資料所對應的類別都記錄下來,當測試物件的屬性和某個訓練物件的屬性完全匹配時,便可以對其進行分類。但是怎麼可能所有測試物件都會找到與之完全匹配的訓練物件呢,其次就是存在乙個測試物件同時與多個訓練物件匹配,導致乙個訓練物件被分到了多個類的問題,基於這些問題呢,就產生了knn。
knn是通過測量不同特徵值之間的距離進行分類。它的思路是:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,其中k通常是不大於20的整數。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。
下面通過乙個簡單的例子說明一下:如下圖,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果k=3,由於紅色三角形所佔比例為2/3,綠色圓將被賦予紅色三角形那個類,如果k=5,由於藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。
在knn中,通過計算物件間距離來作為各個物件之間的非相似性指標,避免了物件之間的匹配問題,在這裡距離一般使用歐氏距離或曼哈頓距離:
同時,knn通過依據k個物件中佔優的類別進行決策,而不是單一的物件類別決策。這兩點就是knn演算法的優勢。knn演算法不僅可以用於分類,還可以用於回歸。通過找出乙個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成反比。
接下來對knn演算法的思想總結一下:就是在訓練集中資料和標籤已知的情況下,輸入測試資料,將測試資料的特徵與訓練集中對應的特徵進行相互比較,找到訓練集中與之最為相似的前k個資料,則該測試資料對應的類別就是k個資料中出現次數最多的那個分類,其演算法的描述為:
1)計算測試資料與各個訓練資料之間的距離;
2)按照距離的遞增關係進行排序;
3)選取距離最小的k個點;
4)確定前k個點所在類別的出現頻率;
5)返回前k個點中出現頻率最高的類別作為測試資料的**分類。
(上面的步驟只取了一次k值,若需要判斷k取何值時最優需要:測試元組集測試完畢後計算誤差率,繼續設定不同的k值重新進行訓練,最後取誤差率最小的k 值。)
二.遇到的問題
1.numpy擴充陣列之repeat和tile
>>> from numpy import *
>>> a=array([10,20])
>>> tile(a,(3,2)) #構造3x2個copy
array([[10, 20, 10, 20],
[10, 20, 10, 20],
[10, 20, 10, 20]])
>>> tile(42.0,(3,2))
array([[ 42., 42.],
[ 42., 42.],
[ 42., 42.]])
>>>
>>> from numpy import *
>>> repeat(7.,4)
array([ 7., 7., 7., 7.])
>>> a=array([10,20])
>>> a.repeat([3,2])
array([10, 10, 10, 20, 20])
>>> repeat(a,[3,2])
array([10, 10, 10, 20, 20])
>>> a=array([[10,20],[30,40]])
>>> a.repeat([3,2],axis=0)
array([[10, 20],
[10, 20],
[10, 20],
[30, 40],
[30, 40]])
>>> a.repeat([3,2],axis=1)
array([[10, 10, 10, 20, 20],
[30, 30, 30, 40, 40]])
>>>
2.sum(a,axis=0)或者是.sum(axis=1) 。平時用的sum應該是預設的axis=0 就是普通的相加 ,而當加入axis=1以後就是將乙個矩陣的每一行向量相加,而當加入axis=0以後就是將乙個矩陣的每一列向量相加
c = np.array([[0, 2, 1], [3, 5, 6], [0, 1, 1]])
print c.sum()
print c.sum(axis=0)
print c.sum(axis=1)
結果分別是:19, [3 8 8], [ 3 14 2]
3.argsort()函式:
先定義乙個array資料
1 import numpy as np4.字典items()方法和iteritems()方法:2 x=np.array([1,4,3,-1,6,9])
現在我們可以看看argsort()函式的具體功能是什麼:
x.argsort()
輸出定義為y=array([3,0,2,1,4,5])。
我們發現argsort()函式是將x中的元素從小到大排列,提取其對應的index(索引),然後輸出到y。例如:x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以y[5]=5
items()方法是將字典中的每個項分別做為元組,新增到乙個列表中,形成了乙個新的列表容器。如果有需要也可以將返回的結果賦值給新變數,這個新的變數就會是乙個列表資料型別。
字典.iteritems()方法與items方法相比作用大致相同,只是它的返回值不是列表,而是乙個迭代器。在需要迭代結果的時候使用最適合,而且它的工作效率非常的高。
最新版本已經沒有iteritems()方法了,需要注意。
5.python 字典(dictionary) get() 函式返回指定鍵的值,如果值不在字典中返回預設值。
6.sorted()函式對所有可迭代的物件進行排序操作。具體可以檢視
7.readlines()方法用於讀取所有行(直到結束符 eof)並返回列表,該列表可以由 python 的 for... in ... 結構進行處理。
如果碰到結束符 eof 則返回空字串。具體可以檢視
8.python的operator模組
9.
import matplotlib.pyplot as plt引數349的意思是:將畫布分割成3行4列,影象畫在從左到右從上到下的第9塊。那第十塊怎麼辦,3410是不行的,可以用另一種方式(3,4,10)。from numpy import *
fig = plt.figure()
ax = fig.add_subplot(349)
ax.plot(x,y)
plt.show()
import matplotlib.pyplot as plt一塊畫布中要顯示多個圖。from numpy import *
fig = plt.figure()
ax = fig.add_subplot(2,1,1)
ax.plot(x,y)
ax = fig.add_subplot(2,2,3)
ax.plot(x,y)
plt.show()
10.python的scatter函式。
11.numpy的陣列.min()
import numpy as np
a = np.array([[1,5,3],[4,2,6]])
print(a.min()) #無參,所有中的最小值
print(a.min(0)) # axis=0; 每列的最小值
print(a.min(1)) # axis=1;每行的最小值
結果:1 [1 2 3] [1 2]
三.總結
knn演算法因其提出時間較早,隨著其他技術的不斷更新和完善,knn演算法的諸多不足之處也逐漸顯露,因此許多knn演算法的改進演算法也應運而生。
針對以上演算法的不足,演算法的改進方向主要分成了分類效率和分類效果兩方面。
分類效率:事先對樣本屬性進行約簡,刪除對分類結果影響較小的屬性,快速的得出待分類樣本的類別。該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。
分類效果:採用權值的方法(和該樣本距離小的鄰居權值大)來改進,han等人於2023年嘗試利用貪心法,針對檔案分類實做可調整權重的k最近鄰居法waknn (weighted adjusted k nearest neighbor),以促進分類效果;而li等人於2023年提出由於不同分類的檔案本身有數量上有差異,因此也應該依照訓練集合中各種分類的檔案數量,選取不同數目的最近鄰居,來參與分類
《機器學習實戰》 K 近鄰演算法
基本原理 通過計算新資料與給定的樣本資料之間的距離,來確定相似度排名 然後取前k個最相似的樣本,統計這k 一般不大於20 個樣本中出現最多的分類,設為新資料的分類。新資料,訓練樣本集,樣本資料標籤 即分類 最近鄰 前k個最相似資料 最近鄰標籤 演算法實施 首先提取要比較的特徵,確定各特徵的權重,進行...
機器學習實戰 K 近鄰演算法
簡單的說,k 近鄰演算法採用測量不同特徵值之間的距離辦法進行分類.收集資料 可以使用任何方法。準備資料 距離計算所需要的數值,最好是結構化的資料格式。分析資料 可以使用任何方法。訓練演算法 此步驟不適用於k 近鄰演算法。測試演算法 計算錯誤率。使用演算法 首先需要輸入樣本資料和結構化的輸出結果,然後...
機器學習實戰 k 近鄰演算法
本系列是基於 機器學習實戰 這本書做的讀書筆記,原書採用python2作為工具,我則將原書 改為用python3編寫並記錄在此系列中。我將把書中對這些機器學習演算法的定義謄上,然後寫下自己對該演算法的通俗理解,之後貼出書中演算法清單中的 本書講解的第乙個機器學習演算法是k 近鄰演算法 knn 它的工...