機器學習 KNN分類演算法(上)

2021-09-29 12:25:59 字數 3905 閱讀 9984

k近鄰演算法是機器學習演算法最簡單的演算法,流程如下:

(1) 計算測試物件到訓練集中每個物件的距離

(2)按照距離的遠近排序

(3)選取與當前測試物件最近的k個物件,作為該測試物件的鄰居

(4)統計這k個鄰居的類別頻率

(5)k個鄰居裡頻率最高的類別,即為測試物件的類別

1、自實現knn演算法

import numpy as np

from math import sqrt

from collections import counter

# 定義分類器

class knnclassifier:

def __init__(self, k):

"""初始化分類器"""

assert k >= 1, "k must be valid"

self.k = k

self._x_train = none

self._y_train = none

def fit(self, x_train, y_train):

"""根據訓練資料集x_train和y_train訓練knn分類器"""

assert x_train.shape[0] == y_train.shape[0], \

"the size of x_train must be equal to the size of y_train"

assert self.k <= x_train.shape[0], \

"the size of x_train must be at least k"

self._x_train = x_train

self._y_train = y_train

return self

def predict(self,x_predict):

"""給定待**資料集x_predict,返回表示x_predict結果的向量"""

assert self._x_train is not none and self._y_train is not none, \

"must fit before predict!"

assert x_predict.shape[1] == self._x_train.shape[1], \

"the feature number of x_predict must be equal to x_train"

y_predict = [self._predict(x) for x in x_predict]

return np.array(y_predict)

def _predict(self, x):

distances = [sqrt(np.sum((x_train - x) ** 2)) for x_train in self._x_train]

nearest = np.argsort(distances)

topk_y = [self._y_train[i] for i in nearest]

votes = counter(topk_y)

return votes.most_common(1)[0][0]

def score(self, x_test, y_test):

"""根據x_test進行**, 給出**的真值y_test,計算**模型的準確度"""

y_predict = self.predict(x_test)

return self.accuracy_score(y_test, y_predict)

def accuracy_score(y_true, y_predict):

"""計算y_true和y_predict之間的準確率"""

assert y_true.shape[0] != y_predict.shape[0], \

"the size of y_true must be equal to the size of y_predict"

return sum(y_true == y_predict) / len(y_true)

def __repr__(self):

return "knn(k=%d)" % self.k

raw_data_x = [[3.393533211, 2.331273381],

[3.110073483, 1.781539638],

[1.343853454, 3.368312451],

[3.582294121, 4.679917921],

[2.280362211, 2.866990212],

[7.423436752, 4.685324231],

[5.745231231, 3.532131321],

[9.172112222, 2.511113104],

[7.927841231, 3.421455345],

[7.939831414, 0.791631213]

]raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

# 設定訓練組

trainx = np.array(raw_data_x)

trainy = np.array(raw_data_y)

# **資料

x1 = np.array([8.093607318,3.365731514])

knn_clf = knnclassifier(k=6)

knn_clf.fit(trainx, trainy)

predict_x = x1.reshape(1,-1)

predict_y = knn_clf.predict(predict_x)

print(predict_y)

2、呼叫sklearn演算法庫
import numpy as np

from sklearn.neighbors import kneighborsclassifier

raw_data_x = [[3.393533211, 2.331273381],

[3.110073483, 1.781539638],

[1.343853454, 3.368312451],

[3.582294121, 4.679917921],

[2.280362211, 2.866990212],

[7.423436752, 4.685324231],

[5.745231231, 3.532131321],

[9.172112222, 2.511113104],

[7.927841231, 3.421455345],

[7.939831414, 0.791631213]

]raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] # 設定訓練組

x_train = np.array(raw_data_x)

y_train = np.array(raw_data_y) # 將資料視覺化

x=np.array([8.093607318,3.365731514])

# 建立knn_classifier例項

knn_classifier = kneighborsclassifier(n_neighbors=6)

# knn_classifier做一遍fit(擬合)的過程,沒有返回值,模型就儲存在knn_classifier例項中

knn_classifier.fit(x_train, y_train)

# knn進行**predict,需要傳入乙個矩陣,而不能是乙個陣列

y_predict = knn_classifier.predict(x.reshape(1,-1))

print(y_predict)

遇到的問題:

1、歐氏距離

2、random_state=20作用

3、reshape(1,-1)含義

4、**2表示2次冪

機器學習分類演算法(一)k NN分類演算法

k kk nn分類器是最簡單的機器學習分類演算法之一,它的基本思想是 從訓練樣本集中找出與測試樣本 距離 最近的k個樣本作為此測試樣本的 鄰居 然後根據這k個樣本的類別基於一定規則進行投票表決,最高的決定為測試樣本的 類別。用乙個詞來說就是 近朱者赤近墨者黑 由以上所述可以得知,k近鄰分類演算法主要...

python 機器學習KNN分類演算法

k近鄰演算法是機器學習中最簡單的演算法,其可以做最基本的分類操作,偽 如下 對未知類別屬性的資料集中的每個點依次執行以下操作 1 計算已知類別資料集中的每個點與當前點之間的距離 2 按照距離遞增次序排序 3 選怒與當前點距離最小的k個點 4 確定前k個點所在類別出現的頻率 5 返回前k個點出現頻率最...

機器學習 KNN分類演算法(下)

機器學習 knn分類演算法 上 之前寫了knn的基本概念和python基本實現方法,並沒有對模型的好壞進行判斷,接下來使用訓練資料集和測試資料集來判斷 使用accurcay分類指標 一 自定義分割資料集方法 data shuffer.py import numpy as np from sklear...