K近邻算法是一种典型的“懒惰学习”算法,该算法没有常规意义上的学习过程。
KNN通过计算待预测数据与训练数据的相似度(距离),选取距离最近的K个训练数据,这K个数据中出现最多的标签类型,作为待预测数据的预测标签,实现过程如下:
导入需要的包:
import pandas as pd
import numpy as np
import random
读取数据:采用的是鸢尾花数据集
data = pd.read_csv('iris.data', header = None)
因为鸢尾花数据集没有测试数据和训练数据之分,所以随机取其中的 1/3的数据作为测试数据,其他的数据作为训练数据:
test_index = random.sample(range(150), int(n/3))
data_test = []
data_train = []
for i in range(n):
if i in test_index:
data_test.append(np.array(data.loc[i]))
else:
data_train.append(np.array(data.loc[i]))
data_train = pd.DataFrame(data_train, index = range(len(data_train)))
data_test = pd.DataFrame(data_test, index = range(len(data_test)))
依次预测数据的标签:
k = 5
m = 0#记录预测正确的次数
for i in range(len(data_test)):
dist = []#记录距离计算结果
x = np.array(data_test.loc[i].loc[[0, 1, 2, 3]])
for j in range(len(data_train)):
y = np.array(data_train.loc[j].loc[[0, 1, 2, 3]])
dist.append(sum((x - y) ** 2) ** 0.5)#距离计算
a = list(np.argsort(np.array(dist)))[0:k]#取得距离最小的前k个训练数据的索引
label_times = {'Iris-setosa':0, 'Iris-versicolor':0, 'Iris-virginica':0}#记录各种标签出现次数
for l in a:
label_times[data_train.loc[l].loc[4]] += 1
label = max(label_times, key=label_times.get)
if label == data_test.loc[i].loc[4]:#记录预测正确的次数
m += 1
最终正确率为:
m / data_test[4].count()
0.94
转载:https://blog.csdn.net/qq_41398808/article/details/101538035
查看评论