k近鄰是一種常用的分類與回歸演算法,簡單直觀。
原理:
k近鄰模型
模型有3個要素——距離度量方法、k值的選擇和分類決策規則。
模型
當3要素確定的時候,對任何例項(訓練或輸入),它所屬的類都是確定的,相當於將特徵空間分為一些子空間。
距離度量
對n維實數向量空間rn,經常用lp距離或曼哈頓minkowski距離。距離的度量詳見部落格
k值的選擇
k較小,容易被雜訊影響,發生過擬合。
k較大,較遠的訓練例項也會對**起作用,容易發生錯誤。
分類決策規則
使用0-1損失函式衡量,那麼誤分類率是:
nk是近鄰集合,要使左邊最小,右邊的必須最大,
所以多數表決=經驗最小化。
k近鄰法的實現:
kd樹
演算法核心在於怎麼快速搜尋k個近鄰出來,樸素做法是線性掃瞄,不可取,這裡介紹的方法是kd樹。
構造kd樹
對資料集t中的子集s初始化s=t,取當前節點node=root取維數的序數i=0,對s遞迴執行:
找出s的第i維的中位數對應的點,通過該點,且垂直於第i維座標軸做乙個超平面。該點加入node的子節點。
該超平面將空間分為兩個部分,對這兩個部分分別重複此操作(s=s',++i,node=current),直到不可再分。
搜尋效率
kd樹搜尋的平均時間複雜度為logn.。所以,當樣本較小時,kd樹搜尋與暴力搜尋接近;但當資料量很大,kd樹搜尋能節省很多搜尋時間。一般來說,k維的資料,資料集超過2k時,kd樹能表現的比較好。
python實現
# -*- coding: utf-8 -*-
"""created on thu oct 19 13:17:31 2017
@author: lizheng
"""#encoding:utf-8
import csv #用於處理csv檔案
import random #用於隨機數
import math
import operator # 函式操作
#載入資料集
def loaddataset(filename,split,trainingset=,testset = ):
with open(filename,"r") as csvfile:
#這裡如果是open("d:\iris.txt","rb")會提示有錯誤
#錯誤為「error: iterator should return strings, not bytes (did you open the file in text mode?)」
lines = csv.reader(csvfile)
dataset = list(lines)
for x in range(len(dataset)-1):
for y in range(4):
dataset[x][y] = float(dataset[x][y])
if random.random()predicted = " + repr(result) + ",actual = " + repr(testset[x][-1]) )
accuracy = getaccuracy(testset, predictions)
print( "accuracy:" + repr(accuracy) + "%")
if __name__ =="__main__":
main()
from sklearn.neighbors import kdtree
x =[[2, 3],
[5, 4],
[9, 6],
[4, 7],
[8, 1],
[7, 2]]
s=[[5,3]]
x.extend(s)
tree = kdtree(x, leaf_size=2, metric='euclidean')
tree.query(x, k=3) #生成kdtree
dist, ind = tree.query(s, k=7)
i = ind[0][1]
print("s-k-nearest :",x[i],"didistance: ",dist[0][i])#返回s的最近鄰和歐氏距離
#print(tree.query(x, k=2, return_distance=false) )
使用scikit-learn的knn演算法進行分類的乙個例項
from sklearn import neighbors
import numpy as np
#資料集
group =np.array([[1.0,1.1],[2.0,2.1],[1.0,1.0],[0,0],[0,0.1],[0.5,0.9]])
labels = ['a','a','a','b','b','b']
knn = neighbors.kneighborsclassifier()
#訓練資料集
knn.fit(group,labels)
#**
predict = knn.predict([[1,2],[3,3]])
print(predict)
使用iris鳶尾花資料集 的乙個例項
from sklearn.datasets import load_iris
from sklearn import neighbors
#檢視iris資料集
iris = load_iris()
print(iris)
knn = neighbors.kneighborsclassifier()
#訓練資料集
knn.fit(iris.data, iris.target)
#**
predict = knn.predict([[1,2,2,5]])
print (predict)
print (iris.target_names[predict])
python中常用包——sklearn主要模組和基本使用方法(jorocco的部落格) 統計學習方法 k近鄰法
k近鄰法 knn 是一種基本的分類與回歸方法 分類這種需求,滲透到我們生活的方方面面 分類演算法可以幫助我們完成這些繁瑣的操作,並根據我們的要求不斷修正分類結果。分類演算法其實蠻多的,這裡順著書本順序,詳細講解knn演算法,再與k means k means 演算法進行簡單對比。k近鄰法是這樣乙個過...
統計學習方法 K近鄰法
k近鄰演算法簡單 直觀給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類.下面先敘述k近鄰演算法,然後再討論其細節。近鄰法的特殊情況 k 1情形,稱為最近鄰演算法.對於輸入的例項點 特徵向量 x xx,最近鄰法將訓練資...
《統計學習方法》 k近鄰法
k近鄰法是一種基本分類與回歸方法。在這裡我們只討論分類問題中的k近鄰法。三要素 k值的選擇 距離度量 分類決策規則 最後會引入一種k近鄰的實現方法 kd樹。輸入 訓練資料集t 輸出 例項x所屬的類y 根據給定的距離度量,在訓練集中找到和x最近的k個點 在這k個點中根據分類決策規則,決定x的類別 注意...