k近鄰演算法,即k-nearest neighbor algorithm,簡稱knn演算法,可以根據字面意思理解為:k個最近的鄰居。因為k近鄰是分類演算法,找到最近的鄰居就能知道自己所在的類別。
k近鄰用於解決分類問題。因為需要計算特徵之間的距離,所以需要將資料集中的特徵資料變成數值型和標稱型。
1.計算出當前未知型別樣本點與訓練集中所有點的距離(歐氏距離);
2.按照距離大小,將訓練集中的點遞增排序;
3.選取前k個樣本點,計算出前k個樣本每個類別出現的頻率;
4.頻率最高的類別即為當前未知樣本**分類;
由於此演算法是計算未知樣本與每乙個訓練點的距離,所以時間複雜度為o(n),之後將學習kd-tree,以降低時間複雜度
import numpy asnpimport pandas
aspd
import
operator
def create_dataset():引數說明: test為測試樣本(乙個向量);# 四組二維
x = np.array([[1,101],[5,89],[108,5],[155,8
]]) y = ['
愛情片', '
愛情片', '
動作片', '
動作片'
]
return x, y
train為訓練集(訓練樣本的特徵組成的矩陣);
labels為標籤(訓練集中每乙個樣本對應的型別組成的向量);
k為引數,表示選取距離最近的k個樣本
函式說明: train為[[1,101],[5,89],[108,5],[115,8]],
test為1個樣本[10,45],
這裡的操作是將test平鋪成[[10,45],[10,45],[10,45],[10,45]],
這樣一來,train和test相減得到的矩陣,就可以用於我們計算測試樣本到每乙個訓練樣本的距離
defknn(test,train,labels,k):
num_train_samples =train.shape[0]
test = np.tile(test,(num_train_samples,1)) #
np.tile將test複製num_train_samples行 複製1列
diff_set = train-test
distance = np.sqrt((diff_set ** 2).sum(axis=1)) #
sum(axis=1)表示每一行的所有列求和
sorted_distance_indicies = np.argsort(distance) #
返回陣列 [1,0,2,3] 表示下標為1的元素值最小,其次是0,以此類推
class_count = {} #
該字典用來存錢k個元素的類別,以及出現次數
for i in
range(k):
label =labels[sorted_distance_indicies[i]]
#dict.get(key,default=none) #字典的get方法返回指定鍵的值,如果不在字典中返回預設0
class_count[label] = class_count.get(label,0)+1
(class_count[label])
#字典按照value值 降序排列
#key = operator.itemgetter(1) 根據字典的值進行排序
#key = operator.itemgetter(0) 根據字典的鍵進行排序
#reverse 降序排序字典
sorted_class_count = sorted(class_count.items(),key=operator.itemgetter(1),reverse=true) #
如[('愛情片', 2), ('動作片', 1)]
return sorted_class_count[0][0]
train,labels =create_dataset()kd tree演算法介紹knn如何選擇合適的k值: 如果選擇較小的k值,就相當於用較小的鄰域內的樣本點進行**,如果碰巧裡面雜訊較多,**結果就會出錯,導致過擬合;test = [50,10]
knn(test,train,labels,k=3)
推薦方法: step 1:用交叉驗證法,將樣本集分為訓練集和驗證集(如隨機分成5份,4份用於訓練,1份用於驗證),輪流選取乙份當驗證集,其餘幾份用來訓練, 統計每一輪的正確率,累計求均值,得到的結果即為當前k值的分類準確率;
step 2:更換k值,重複step 1,最終選取平均**準確率最高的k值作為模型的k值
knn 演算法的優缺點: 1.優點:
(1) 理論成熟,思想簡單,可處理數值型或者離散型資料,既可以用來做分類也可以用來做回歸
(2) 可用於非線性分類(線性不可分的樣本集)
(3) 訓練時間複雜度比支援向量機之類的演算法低,僅為o(n),kd-tree為o(log n)
(4) 受異常值(離群點)的影響小
2.缺點:
(1) 計算量大,尤其是特徵數非常多的時候
(2) 樣本分佈不平衡的時候,對於小類別的**準確性低
(3) 使用懶散學習方法,基本上不學習,每次**都要計算一遍在樣本集中的最鄰近點
KNN演算法總結
總體 分類演算法 有目標值,離散型 乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。k 本身取值對演算法有影響,又不能通過演算法訓練確定值的變數叫做超引數 距離 scikit learn 機器學習工具 k近鄰的sklearn的實現 skl...
星期推算法
通常我們只知道生活當天的前後幾天是星期幾,即便是翻日曆,也只能知道有限日期的星期數。那麼有沒有一種方法可以讓我們知道任何一天是星期幾呢?有,下面我將向大家介紹一種方法,用以編寫萬年曆的程式。首先我們必須約定一些法則,我們用y m d分別表示年 月 日,用數字0 6分別表示星期日 星期六,這樣我們就可...
K近鄰 KNN 演算法總結
knn演算法是選擇與輸入樣本在特徵空間內最近鄰的k個訓練樣本並根據一定的決策規則給出輸出結果。決策規則 分類任務 輸出結果為k個訓練樣本中佔大多數的類。回歸任務 輸出結果為k個訓練樣本值的平均值。如下圖的分類任務,輸出結果為w1類。k值的選擇 距離度量和分類決策規則是k近鄰演算法的三個基本要素。分類...