小言_互联网的博客

机器学习 KNN(K-Nearest Neighbor)

345人阅读  评论(0)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场