監督就是給的樣本都有標籤,分類的訓練樣本必須有標籤,所以分類演算法都是有監督演算法。監督機器學習無非就是「minimize your error while regularizing your parameters」,也就是在規則化引數的同時最小化誤差。最小化誤差是為了讓我們的訓練資料,而規則化引數是防止我們的模型過分擬合我們的訓練資料,提高泛化能力
knn(k 最鄰近分類演算法)
1.演算法思路
通過計算每個訓練樣例到待分類樣品的距離,取和待分類樣品距離最近的 k 個訓練樣例,k 個樣品中哪個類別的訓練樣例占多數,則待分類樣品就屬於哪個類別
核心思想:如果乙個樣本在特徵空間中的 k 個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。 knn 方法在類別決策時,只與極少量的相鄰樣本有關。由於 knn 方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的, 因此對於類域的交叉或重疊較多的待分樣本集來說,knn 方法較其他方法更為適***合。
**2.演算法描述
1.算距離:給定測試物件,計算它與訓練集中的每個物件的距離
依公式計算 item 與 d1、d2 … …、dj 之相似度。得到 sim(item, d1)、sim(item, d2)… …、
sim(item, dj)。
2. 將 sim(item, d1)、sim(item, d2)… …、sim(item, dj)排序,若是超過相似度閾值 t 則放入鄰居
案例集合 nn。
找鄰居:圈定距離最近的 k 個訓練物件,作為測試物件的近鄰
3. 自鄰居案例集合 nn 中取出前 k 名,依多數決,得到 item 可能類別。
做分類:根據這 k 個近鄰歸屬的主要類別,來對測試物件分類
3.演算法步驟
•step.1—初始化距離為最大值
•step.2—計算未知樣本和每個訓練樣本的距離 dist
•step.3—得到目前 k 個最臨近樣本中的最大距離 maxdist
•step.4—如果 dist 小於 maxdist,則將該訓練樣本作為 k-最近鄰
•step.5—重複步驟 2、3、4,直到未知樣本和所有訓練樣本的距
•step.6—統計 k-最近鄰樣本中每個類標號出現的次數
•step.7—選擇出現頻率最大的類標號作為未知樣本的類標號
該演算法涉及 3 個主要因素:訓練集、距離或相似的衡量、k 的大小
五.演算法優缺點
1)優點
簡單,易於理解,易於實現,無需估計引數,無需訓練;
適合樣本容量比較大的分類問題
特別適合於多分類問題(multi-modal,物件具有多個類別標籤),例如根據基因特徵來判斷其功能分類,knn 比 svm 的表現要好
2)缺點
懶惰演算法,對測試樣本分類時的計算量大,記憶體開銷大,評分慢;
可解釋性較差,無法給出決策樹那樣的規則
對於樣本量較小的分類問題,會產生誤分
六.常見問題
1)k 值設定為多大
k 太小,分類結果易受雜訊點影響;k 太大,近鄰中又可能包含太多的其它類別的點。(對距離加權,可以降低 k 值設定的影響)
k 值通常是採用交叉檢驗來確定(以 k=1 為基準) 經驗規則:k 一般低於訓練樣本數的平方根2)類別如何判定最合適
投票法沒有考慮近鄰的距離的遠近,距離更近的近鄰也許更應該決定最終的分類,所以加權投票法更恰當一些。
3)如何選定合適的距離衡量
高維度對距離衡量的影響:眾所周知當變數數越多,歐式距離的區分能力就越差。
變數值域對距離的影響:值域越大的變數常常會在距離計算中佔據主導作用,因此應先對變數進行標準化。
4)訓練樣本是否要一視同仁
在訓練集中,有些樣本可能是更值得依賴的。
可以給不同的樣本施加不同的權重,加強依賴樣本的權重,降低不可信賴樣本的影響。
5)效能問題
knn 是一種懶惰演算法,平時不好好學習,考試(對測試樣本分類)時才臨陣磨槍(臨時去找 k 個近鄰)。
懶惰的後果:構造模型很簡單,但在對測試樣本分類地的系統開銷大,因為要掃瞄全部訓練樣本並計算距離。
已經有一些方法提高計算的效率,例如壓縮訓練樣本量等。
歡迎加入非盈利python程式設計學習交流qq群783462347,群裡免費提供500+本python書籍!
6)能否大幅減少訓練樣本量,同時又保持分類精度?
濃縮技術(condensing)
編輯技術(editing)
舉例如下:
原始資料如下:
python**如下:
利用上述資料用knn演算法實現性別判定:
# -*-coding:utf-8-*-
import numpy as np
class knn:
def __init__(self, k):
# k為最近鄰個數
self.k = k
# 準備資料
def createdata(self):
features = np.array([[180, 76], [158, 43], [176, 78], [161, 49]])
labels = ["男", "女", "男", "女"]
return features, labels
# 資料進行min-max標準化
def normalization(self, data):
maxs = np.max(data, axis=0)
mins = np.min(data, axis=0)
new_data = (data - mins) / (maxs - mins)
return new_data, maxs, mins
# 計算k近鄰
def classify(self, one, data, labels):
# 計算新樣本與資料集中每個樣本之間的距離,這裡距離採用的歐式距離計算方法
differencedata = data - one
squaredata = (differencedata ** 2).sum(axis=1)
distance = squaredata ** 0.5
sortdistanceindex = distance.argsort()
# 統計k近鄰的label
labelcount = dict()
for i in range(self.k):
label = labels[sortdistanceindex[i]]
labelcount.setdefault(label, 0)
labelcount[label] += 1
# 計算結果
sortlabelcount = sorted(labelcount.items(), key=lambda x: x[1], reverse=true)
print(sortlabelcount)
return sortlabelcount[0][0]
if __name__ == "__main__":
# 初始化類物件
knn = knn(3)
# 建立資料集
features, labels = knn.createdata()
# 資料集標準化
new_data, maxs, mins = knn.normalization(features)
# 新資料的標準化
one = np.array([176, 76])
new_one = (one - mins) / (maxs - mins)
# 計算新資料的性別
result = knn.classify(new_one, new_data, labels)
print("資料 {} 的**性別為 : {}".format(one, result))
資料探勘 分類演算法 KNN
knn k nearest neighbors k近鄰分類演算法 knn演算法從訓練集中找到和新資料最接近的k條記錄,然後根據他們的主要分類來決定新資料的類別。knn分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表...
kNN分類演算法
knn k nearest neighbors 又叫k最鄰近演算法,是一種根據待分類的樣本與已知類別的樣本間的距離得到其分類結果的分類演算法。計算待分類樣本與所有已知類別樣本的距離值 從這些距離值中選取最小的k個 根據這k個樣本的類別情況,確定待分類的分類結果 距離的計算 這裡的距離其實是一種相似度...
kNN分類演算法
一 概述 knn演算法採用測量不同特徵值之間的距離方法進行分類。對未知類別屬性的資料集中的每個點執行如下操作 1 計算已知類別資料集中的點與當前點之間的距離 2 按照距離遞增次序排序 3 選取與當前點距離最小的k個點 4 確定前k個點所在類別的出現頻率 5 返回前k個點出現頻率最高的類別作為當前點的...