python自带的KNN算法使用
import math
import operator
import matplotlib.pyplot as plt
from sklearn import neighbors
from sklearn import datasets
# 获取KNN分类器
from sklearn.model_selection import train_test_split
knn = neighbors.KNeighborsClassifier()
# 加载数据
iris = datasets.load_iris()
print(iris)
# 建立模型
knn.fit(iris.data, iris.target)
# 输入预测模型进行预测
predictedLabel = knn.predict([[5.9, 3., 5.1, 1.8]])
# 输出预测结果
print('-' * 100)
print(predictedLabel)
手写KNN实现
# 1.分割数据集
# 2.计算测试集中的每一个元素到训练集所有元素中最近的p个元素
# 3.将这p个元素的类别的数量进行排序,数量最多的设定为测试集的元素的类别
# 4.循环,预测测试集的所有元素
# 5.计算测试集的准确率
X = iris.data
y = iris.target
# 1.分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7)
# print(X)
y_predict = []
p = 3
for i in range(len(X_test)):
Xtes = X_test[i]
Dis = {}
for j in range(len(X_train)):
Xtra = X_train[j]
ytra = y_train[j]
dis = 0
for k in range(len(Xtes)):
dis += pow((Xtes[k] - Xtra[k]), 2)
Dis[math.sqrt(dis)] = ytra
# print(Dis)
# print(len(Dis))
sortedNotes = sorted(Dis.items(), key=operator.itemgetter(0), reverse=False)
W = []
# 2.计算测试集中的每一个元素到训练集所有元素中最近的p个元素
for t in range(p):
s = list(sortedNotes[t])
W.append(s[1])
# 3.将这p个元素的类别的数量进行排序,数量最多的设定为测试集的元素的类别
most = max(W, key=W.count)
y_predict.append(most)
计算测试集的准确率
# 5.计算测试集的准确率
count = 0
for i in range(len(y_test)):
if y_test[i] == y_predict[i]:
count += 1
print('手写测试准确值:', count / len(y_test))
plt.plot(y_test, 'r-')
plt.plot(y_predict, 'b-')
plt.show()
图形结果