k-NN算法代码

获取鸢尾花数据,设置训练集和测试集

from sklearn.datasets import load_iris
import numpy as np
import matplotlib.pyplot as plt
#加载鸢尾花数据
datas = load_iris()
#利用切片收集150组鸢尾花数据(datas['data']表示datas的‘data’key值对应的数据,即鸢尾花的花瓣花萼数据)
x_data = datas['data'][0:150]
#表示鸢尾花源数据的类别,0代表setosa,1代表versicolor,2代表virginica(K-NN算法处理基于监督学习的分类问题)
#datas['target']表示datas的‘target’key值对应的数据,即鸢尾花的类别(标签)
y_data = datas['target'][0:150]
#产生训练集(鸢尾花源数据的百分之50)
x_train = x_data[0:150:2]
y_train = y_data[0:150:2]
#产生测试集(鸢尾花源数据的百分之50)
x_test = x_data[1:150:2]
y_test = y_data[1:150:2]
y_data
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

绘制数据集(以,前两个特征绘制在坐标系上)

plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='g',label="symbol 0")
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='r',label="symbol 1")
plt.scatter(x_train[y_train==2,0],x_train[y_train==2,1],color='b',label="symbol 2")
plt.title("k-NN view")
plt.xlabel("x axis")
plt.ylabel("y axis")
plt.legend()
plt.show()

在这里插入图片描述

新增加一个数据(该数据是示例)判断其的类别为0 or 1 or 2(根据距离)

x = np.array([4.5023242,3.03123123,1.3023123,0.102123123])
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='g',label="symbol 0")
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='r',label="symbol 1")
plt.scatter(x_train[y_train==2,0],x_train[y_train==2,1],color='b',label="symbol 2")
plt.scatter(x[0],x[1],color='black',label="symbol ?")
plt.title("k-NN view")
plt.xlabel("x axis")
plt.ylabel("y axis")
plt.legend()
plt.show()

在这里插入图片描述

K-NN过程(训练)(计算距离,并将其存储到列表)

from math import sqrt
distances = []
for x0 in x_train:
    d = sqrt(np.sum((x-x0)**2))
    distances.append(d)

#将距离排序(由大到小)返回的是元素下标
near = np.argsort(distances)
k = 3

#选择出前5个最近元素的类别
topK_y = [y_train[i] for i in near[:k]]
topK_y
[0, 0, 0]
from collections import Counter
#统计元素出现的个数(即代表这鸢尾花类别的数字的个数)
votes = Counter(topK_y)
votes
Counter({0: 3})

出预测的结果,0代表setosa,1代表versicolor,2代表virginica

#找出票数最多的一个元素,该方法返回的是一个元组,我们只需要key值(也就是类别)
result = votes.most_common(1)[0][0]
result
0

注意这里用的是上面的测试数据,但是步骤是重新开始的因为要一个个遍历测试集并将预测结果与源数据中的结果比较得出正确率统计测试数据的精度

count = 0
index = 0
for j in x_test:
    distance = []
    x = j;
    #计算距离
    for x1 in x_train:
        t = sqrt(np.sum((x-x1)**2))
        distance.append(t)
    near = np.argsort(distance)
    topK_y = [y_train[i] for i in near[:k]]
    votes = Counter(topK_y)
    result = votes.most_common(1)[0][0]
    if y_test[index]==result:
        count=count+1
        index=index+1
    else:
        index=index+1
score=count/25
score
0.96
发布了57 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42419462/article/details/102507657