它是一種基本分類與回歸的方法。在分類時,根據其k個最近鄰的訓練例項的類別,通過多數表決等方式進行**。k近鄰不具有顯式的學習過程。
k近鄰法,實際上對應特徵空間的劃分。以最近鄰法為例,子空間的劃分,是相鄰點之間做垂直平分線/面,然後相交集後,劃分出的各個子空間。當例項點處在某一特徵子空間中,那麼它的類別就對應於特徵子空間所對應的類別。
要找出最近的k個點,對於「最近」這個概念,首先就要定義例項點之間的距離問題。
對於特徵空間是n維實數向量空間,一般使用lp距離來度量:
p=2時,就是常用的歐式距離。
p=1時,叫做曼哈頓距離。求的是各座標距離絕對值之和。
特例是,當p=∞時,我們是取各個座標距離的最大值,即 max|xi-xj| 。
k值取值的大小對結果會產生重大影響。
- k取小,那麼**結果會對近鄰的例項點非常敏感。此意味著整體模型變得複雜,容易過擬合。
- k取大,這時與輸入例項較遠的訓練例項也會起作用。模型雖然變簡單了,但是訓練集的資訊沒有被完全利用。
k近鄰策略很容易理解,就是在k個近鄰裡,進行多數投票機制。
對於最近鄰的k個訓練例項點構成乙個集合nk(x),設這一區域點的真實類別是cj,那麼,誤分類率可以表示為:
- 此區域內不是cj類別的點的個數 / 此區域總的點個數k。欲使誤分類率最小,就要使此區域內本身屬於cj點的個數達到最多。所以,我們採用多數表決規則就等價於誤分類率最小化。
對於kd樹,詳見以下部落格,講的很清楚:
from numpy import *
defknnclasssify
(testing,trainning,lables,k):
numpots = len(trainning)
temp1 = tile(testing,[numpots,1]) - trainning
sqrtemp1 = temp1 ** 2
temp2 = sqrtemp1.sum(axis=1)
distances = temp2 ** 0.5
sorteddistance = distances.argsort()
classlable={}
for i in xrange(k):
tmplable = lables[ sorteddistance[i] ]
classlable[tmplable] = classlable.get(tmplable,0) + 1
return max(classlable)
if __name__ == '__main__':
trainning = [1.0,0.9],[1.0,1.0],[0.1,0.2],[0.0,0.1]
lables = ['a','a','b','b']
testing = [1.2,1.0]
lable = knnclasssify(testing,trainning,lables,3)
print lable
距離用了簡單的二範數來檢測。 靜態鍊錶相關概念及其操作
靜態鍊錶結構 首先我們先來看看靜態鍊錶的結構定義 typedef structcomponent,staticlinklist maxsize status initlist staticlinklist l l maxsize 2 cur 0 備用鍊錶的表尾 l maxsize 1 cur 0 資...
k近鄰法及其實現 python
k 近鄰法 k nn 是一種基本的分類和回歸方法。以分類任務為例,k 近鄰法假設給定乙個訓練資料集及其類別標籤。分類時,對乙個新來的待 例項,只需要根據離它最近的 k 個訓練例項的類別標籤,通過多數表決的方式決定待 例項的類別。演算法流程如下 演算法3.1 k 近鄰法 輸入 訓練資料集 t t t ...
SpringAOP概念及其使用
aop aspect oriented programming 面向切面程式設計 通過預編譯方式和執行期動態 實現程式功能的統一維護的一種技術。aop是oop的延續,是軟體開發中的乙個熱點,也是spring框架中的乙個重要內容,是函式式程式設計的一種衍生范型。利用aop可以對業務邏輯的各個部分進行隔...