(1)鄰近演算法
或者說k最近鄰(knn,k-nearestneighbor)分類演算法是資料探勘
分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的
意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。
(2)主要思路1. 準備資料,對資料進行預處理
2. 選用合適的資料結構儲存訓練資料和測試元組
3. 設定引數,如k
4.維護乙個大小為k的的按距離由大到小的優先順序佇列,用於儲存
最近鄰訓練元組。隨機從訓練元組中選取k個元組作為初始的最近
鄰元組,分別計算測試元組到這k個元組的距離,將訓練元組標號
和距離存入優先順序佇列
5. 遍歷訓練元組集,計算當前訓練元組與測試元組的距離,將所
得距離l 與優先順序佇列中的最大距離lmax
6. 進行比較。若l>=lmax,則捨棄該元組,遍歷下乙個元組。若
l < lmax,刪除優先順序佇列中最大距離的元組,將當前訓練元組
存入優先順序佇列。
7. 遍歷完畢,計算優先順序佇列中k 個元組的多數類,並將其作為
測試元組的類別。
8. 測試元組集測試完畢後計算誤差率,繼續設定不同的k值重新
進行訓練,最後取誤差率最小的k值。
(1)演算法流程圖
(2)演算法實現
# -*- coding: utf-8 -*-
"""@author: baohj
"""# 模仿sklearn 形式封裝
from sklearn.datasets import load_iris # 匯入資料集iris
import math
from collections import counter
import numpy as np
class
k_nn
:'''初始化'''
def__init__
(self, k)
: self.k = k
self._x_train =
none
self._y_train =
none
deffit
(self, x_train, y_train)
:'''必須是相同的'''
self._x_train = x_train
self._y_train = y_train
return self
defpredict
(self, x_pre)
:'''給定待**數劇集,給出**結果向量'''
y_pre =
[self._predict(x)
for x in x_pre]
return np.array(y_pre)
'''給定單個資料,返回**類別'''
def_predict
(self, x)
:#計算距離
d =[math.sqrt(np.
sum(
(x - self._x_train[i])**
2))for i in
range
(len
(self._x_train))]
near = np.argsort(d)
#計算k個最近鄰
top_k =
[self._y_train[i]
for i in near[0:
6]] votes = counter(top_k)
pre_y = votes.most_common(1)
[0][
0]# **結果存在pre_y中
return pre_y
# 載入資料集,有iris.data和iris.target
iris = load_iris(
)# 前149個樣本作為訓練集,最後乙個做**
test_x = iris.data[0:
149]
test_y = iris.target[
:149
]x = iris.data[
149]
print
("資料集:"
, end="")
print
(test_y)
knn = k_nn(6)
knn.fit(test_x, test_y)
print
("結果:"
, end="")
print
(knn.predict(
[x])
)
取前149個資料作為訓練集,最後乙個為測試集。由執行結果可以看出,**結果為2。執行並未出現錯誤。
(1)優點
(1)理論成熟簡單,易於理解及演算法實現;
(2) 可以用於多分類分類、回歸等;
(2)缺點(1)需要計算待分類樣本與所有已知樣本的距離,計算量大;
(2)樣本容量小或樣本分佈不均衡時,容易分類錯誤,後者可
通過施加距離權重進行改善;
在knn演算法的實現中包含了很多種情況,和多個步驟。事先通過書籍
和網路資料總結出實現knn演算法的步驟,然後根據步驟利用python的強大
資料處理功能進行處理最終得到完整的程式。
最終發現,實現knn演算法並非很難,重點在於利用python的資料處理
能力。只要做好python的使用即可。
Python實現KNN演算法
from numpy import import operator def creatdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 lables a a b b return group,lables def classify0 inx,dataset,...
python實現knn演算法
importnumpyasnp importoperator defcreatedataset group np.array 1.0 1.1 1.0 1.0 0.0 0.0 0.0 0.1 labels a a b b returngroup,labels 分類演算法 inx待分類的點 defcla...
python實現KNN演算法
具體 如下 import numpy as np import matplotlib.pyplot as plt class myknn def init self,k self.k k def compute self,x train,y train,x test dist i 0 計算歐式距離 ...