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...