python實現k近鄰

k近鄰分類器大概想法是  在已知許多樣本分好類的狀況下,給定一個新樣本i, 計算獲得與i最接近的k個樣本,那麼假設這k個樣本爲a1, a2, ... , ak ,總共五個類別{1,2,3,4,5},python

  其中就有{a1:3, a2:4, a3:1, ... ,  ak:2},a1 所對的值3 就爲它的類別,如今若是在這個k個樣本里,屬於類別3 的樣本最多,那麼咱們就能夠把樣本i 歸爲類別3app

如今來用python 簡單實現下這個分類器函數

首先定義一下數據集結構測試

數據矩陣 X_train表示訓練樣本矩陣,y_train 表示訓練樣本的類別向量spa

import numpy as np
train = np.array(zip(X_train,y_train)) test = np.array(zip(X_test, y_test))

 那麼求解這個分類器就能夠歸於如下幾個步驟:code

1. 計算任意兩個樣本點的距離blog

import math

# 計算兩點的歐式距離
def distance(p1, p2):
    points = zip(p1, p2)#  使用zip迭代函數
    d = [pow(a - b, 2) for (a, b) in points]
    return math.sqrt(sum(d))

2. 找出k個最接近鄰居ip

from operator import itemgetter
def neighbours(trains, test, k):
    distances = [tuple_distance(train, test) for train in trains]# 輸出形式[array([array([ 2.3, 3.4, 2.3]), 0], dtype=object)] 
    sort_d = sorted(distances, key=itemgetter(1))#根據距離來排列(key=itemgetter(1))
    sort_train= [a[0] for a in sort_d]#排列後的訓練矩陣
    return sort_train[:k]# 選取前k個鄰居樣本
def tuple_distance(train, test):
    return (train, get_distance(test, train[0]))#   (array([array([ 2.3, 3.4]), 0], dtype=object), 2.222333)

 

3. 根據每一個鄰居的類別投票決定get

def vote(neighbours_matrix):
    classes = [neighbour[1] for neighbour in neighbours_matrix]#返回鄰居的類別列表
    count = Counter(classes)  
    return count.most_common()[0][0]

總的來講it

predictions = []
for x in range(len(X_test)):

    neighbours = neighbours(train, test[x][0], 5)
    votes = vote(neighbours)
    predictions.append(votes)
    

這樣就能夠獲得測試樣本的預測列表predictions ,好了。

相關文章
相關標籤/搜索