import sklearn
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
import sklearn.datasets as data
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import pandas as pd
from tensorboard.notebook import display
import svgTest
class KNN:
def __init__(self, k):
self.k = k
def fit(self, X, y):
self.X = np.asarray(X)
self.y = np.asarray(y).astype(int)
def predict(self,X):
X = np.asarray(X)
result = []
for i in X:
# 计算距离
dis = np.sqrt(np.sum((i - self.X) ** 2, axis=1))
# 对距离按索引排序
index = dis.argsort()
# 找出设定的近邻 k 前几项
index = index[:self.k]
# 元素必须是非负整数 采用距离的倒数权重增加 二版本,添加权重
count = np.bincount(self.y[index], weights=1 / dis[index])
result.append(count.argmax())
return np.asarray(result)
if __name__ == '__main__':
iris = data.load_iris()
x_train = iris.data
y_train = iris.target
My = KNN(k=3)
plt.figure(figsize=(10, 10))
# My.fit(x_train, y_train)
# print(My.predict(x_train))
# print((y_train == My.predict(x_train)) + 0)
# print(np.array(x_train))
# print(y_train[:, np.newaxis])
data = np.c_[x_train, y_train[:,np.newaxis]]
data = pd.DataFrame(data)
t0 = data[data.iloc[:,4]==0]
t1 = data[data.iloc[:,4]==1]
t2 = data[data.iloc[:,4]==2]
print(type(t0))
t0 = t0.sample(len(t0), random_state=0)
t1 = t1.sample(len(t1), random_state=0)
t2 = t2.sample(len(t2), random_state=0)
Train_x = pd.concat([t0.iloc[:40,:-1], t1.iloc[:40,:-1], t2.iloc[:40,:-1]],axis=0)
Train_y = pd.concat([t0.iloc[:40,-1], t1.iloc[:40,-1], t2.iloc[:40,-1]],axis=0)
Test_x = pd.concat([t0.iloc[40:,:-1], t1.iloc[40:,:-1], t2.iloc[40:,:-1]],axis=0)
Test_y = pd.concat([t0.iloc[40:,-1], t1.iloc[40:,-1], t2.iloc[40:,-1]],axis=0)
My.fit(Train_x, Train_y)
result = My.predict(Test_x)
print(np.sum(result == Test_y) / len(result))
# 设置中文字体,随便一个字体就可以不一定是黑体 后面那个是不使用unicode负号
mpl.rcParams['font.family'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
# 绘图操作
plt.scatter(x=t0[0][:40], y = t0[1][:40], c='r', label = '数据1')
plt.scatter(x=t1[0][:40], y = t0[1][:40], c='g', label = '数据2')
plt.scatter(x=t2[0][:40], y = t0[1][:40], c='b', label = '数据3')
right = Test_x[result == Test_y]
wrong = Test_x[result != Test_y]
print(right)
print("*************")
print(wrong)
plt.scatter(x=right[0][:40], y=right[1][:40], c='c', marker='x',label = '数据4')
plt.scatter(x=wrong[0][:40], y=wrong[1][:40], c='m', marker='x', label='数据5')
plt.legend()
plt.show()
python实现KNN分类算法
最新推荐文章于 2023-10-21 10:04:12 发布