import numpy as np
import math
class customkneighborsclassifier():
'''knn 自定義實現類
'''def __init__(self,k=3):
'''初始化賦值,
x_train 特徵測試集變數
y_train 標量測試集變數
res_class **結果
:param k: 預設值3
'''self.k = k
self.x_train=
self.y_train=
self.res_class=
def fit(self,x_train,y_train):
'''knn模型訓練
:param x_train: 訓練集特徵資料
:param y_train:訓練集目標資料
:return:self
'''assert x_train.shape[0] == y_train.shape[0], "訓練集特徵與目標值個數不匹配!"
assert self.k <= x_train.shape[0], "k值超出訓練資料範圍!"
self.x_train = x_train
self.y_train = y_train
print('k:',self.k)
print('x:', self.x_train.shape)
print('y:', self.y_train.shape)
return self
# 距離計算
def distance_calculation(self, x_test):
t = 0
distance_ =
while (t < len(x_test)):
# 計算測試集距離
# distance = [math.sqrt(np.sum(train_x - x_test) ** 2) for train_x in self.x_train]
t += 1
return distance_
def predict(self,x_predict):
# 斷言檢查**資料集非空,且特徵數是否與訓練資料集相同 x_predict is not none or
assert x_predict.shape[1] == self.x_train.shape[1],'特徵數不匹配!!!'
# 返回**資料與訓練資料的距離
distances = self.distance_calculation(x_predict)
print("test_x與訓練集資料距離:",distances)
# 擷取k範圍內的近鄰資料
count_mix = self.count_train_by_k(distances)
print("k近鄰資料:", count_mix)
# 多數表決**分類:
self.max_voter(count_mix)
return self
# 對距離進行排序,並返回k值範圍內的樣本資料
def count_train_by_k(self,distances):
k = self.k
# 將每個**資料與特徵資料之間的距離轉換成字典 key為
dict_distances = {}
count_mixs=
count_mixs_=
# 將距離值轉換成帶有key值的字典
#[[{},{}]]
for i in range(len(distances)):
dic_ = {}
for i2 in range(len(distances[i])):
dic_[i2] = distances[i][i2]
count_mixs__=
# 排序並擷取k個範圍內的最近值
for i in range(len(count_mixs)):
dic_new_distance = {}
dict_distances = dict(sorted(count_mixs[i].items(), key=lambda x: x[1], reverse=false))
ct=0
#遍歷**資料的距離集字典,擷取前k個資料
for key in dict_distances:
dic_new_distance[key] = dict_distances[key]
ct += 1
if ct == self.k:
break
return count_mixs__
# 多數表決分類
def max_voter(self,count_mix):
# 獲取分類
list_class=
for i in range(len(count_mix)):
list_class2 =
for key in count_mix[i]:
print('k近鄰結果列印:',list_class)
# 對y值進行分類
set_list_class=
for i in range(len(list_class)):
# 對分類進行統計並返回最大的y值
for i in range(len(set_list_class)):
dict_count = {}
for item in set_list_class[i]:
dict_count.update()
cls = max(dict_count, key=dict_count.get)
print("最終**結果", self.res_class)
return self
from knn實現.kneighborsclassifiercustom import customkneighborsclassifier
import numpy as np
kn = customkneighborsclassifier(5)
# 訓練資料
x=[[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3],
[6,6],[6,7],[6,8],[7,6],[7,7],[7,8], [8,6],[8,7],[8,8],
[11,1],[11,2],[11,3],[12,1],[12,2],[12,3],[13,1],[13,2],[13,3]]
# y=[[0],[0],[0],[0],[0],
# [1],[1],[1],[1],[1],
# [2],[2],[2],[2],[2]]
y=[['a'],['a'],['a'],['a'],['a'],['a'],['a'],['a'],['a'],
['b'],['b'],['b'],['b'],['b'],['b'],['b'],['b'],['b'],
['c'],['c'],['c'],['c'],['c'],['c'],['c'],['c'],['c']]
x=np.asarray(x)
y=np.asarray(y)
#模型訓練
kn.fit(x,y)
# 資料**
x_test = [[10,1],[5,5]]
x_test = np.asarray(x_test)
kn.predict(x_test)
# 散點圖觀察
x1=y1=
for i in np.asarray(x):
x2=y2=
for i in np.asarray(x_test):
import matplotlib.pyplot as plt
plt.plot(x1,y1,'r*')
plt.plot(x2,y2,'g+')
plt.show()
KNN演算法識別手寫數字
前言 從現在開始博主要開始學習機器學習了,歡迎有共同興趣的人一起學習。廢話不多說了,開始上 一 將資料集csv檔案匯入到python中,並將csv格式轉為list格式 def dataset 讀取訓練集檔案路徑 path trains1.csv os.path.abspath machinelear...
手寫數字識別 KNN演算法的應用
訓練之後,即可識別手寫數字如下 我用windows自帶的畫板畫的,可能有點醜,見諒 等等執行在自己安裝好jupyter的伺服器上,安裝可以參考 在centos上安裝jupyter notebook 支援外網訪問 一定要保證路徑正確,如果不希望做任何修改的話,請保證相對路徑如下 此python檔案 如...
機器學習 KNN演算法 手寫識別
1.1 簡介 knn演算法即k最近鄰分類演算法,是機器學習的一種。從訓練樣本集中選取k個與測試樣本 距離 最近的樣本,這k個樣本中出現頻率最高的類別作為該測試樣本的類別。1.2 要求 目標 分類未知類別的案例。輸入 待分類未知類別案例專案 測試集 已知類別案例集合d 訓練集 輸出 未知類別案例的可能...