Artificial Intelligence-knn算法

Artificial Intelligence

knn算法

基本概念

什么是knn?knn即K-Nearest Neighbor,k最邻近算法。

KNN算法的思路:如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某一个类别,则该样本也划分为这个类别。

经典示例如图:在这里插入图片描述

我们要确定绿点属于哪个颜色,要做的就是选出距离目标点距离最近的k个点,看这k个点的大多数颜色是什么颜色。

1.当k取3的时候,我们可以看出距离最近的三个,分别是红色、红色、蓝色,因此得到目标点为红色。(2红>1蓝)

2.当k取5的时候,我们可以看出距离最近的五个,分别是红色、红色、蓝色,蓝色,蓝色,因此得到目标点为蓝色。(2红<3蓝)

算法步骤

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别(决策依据方法之一)作为测试数据的预测分类。

注意事项

K的取值尽量要取奇数,以保证在计算结果最后会产生一个较多的类别,如果取偶数可能会产生相等的情况,不利于预测。

欧几里得距离(欧氏距离)

计算测试数据到其他所有数据的距离,常用到的距离计算公式如下:

欧几里得距离(欧氏距离):在这里插入图片描述

优缺点

优点

1)既可以用来做分类也可以用来做回归;

2)可用于数值型数据和离散型数据;

3)训练时间复杂度为O(n);无数据输入假定;

4)对异常值不敏感。

缺点

1)计算复杂性高;空间复杂性高;

2)样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);

3)一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分;

代码实现

import matplotlib.pyplot as plt

import matplotlib
from math import sqrt

#原始数据
data_A = [[1,1],[1.8,2],[2.5,4],[3.2,2.6],[5.2,2.8]]#数据A
data_B = [[4,5.7],[4.2,4.6],[6.8,5],[6.5,7]]#数据B
test_data = [[2.6,2.6]]#待测值
len_A = len(data_A)
len_B = len(data_B)

#计算距离
distance_A = []#与A类数据之间的距离
distance_B = []#与B类数据之间的距离
distance = []#全部距离
#欧氏距离
for i in range(len_A):
    d = sqrt((test_data[0][0]-data_A[i][0])**2+(test_data[0][1]-data_A[i][1])**2)
    distance_A.append(d)
for i in range(len_B):
    d = sqrt((test_data[0][0]-data_B[i][0])**2+(test_data[0][1]-data_B[i][1])**2)
    distance_B.append(d)
#冒泡排序法小->大
distance = distance_A + distance_B
for i in range(len(distance)-1):
    for j in range(len(distance)-i-1):
        if distance[j] > distance[j+1]:
            distance[j],distance[j+1]=distance[j+1],distance[j]
print("距离所有A类数据的距离为:")
print(distance_A)
print("距离所有B类数据的距离为:")
print(distance_B)
print()
print("对所有的距离升序排序:")
print(distance)
print()

#按K最近领对测试集进行分类
K = 5#相当于让多少人投票
number_A = 0
number_B = 0
#定义删除函数,避免对同一个数据重复计算
def delete(a,b,ls):
    for i in range(b):
        if ls[i]==a:
            ls.pop(i)
            break
#找出与测试数据最接近的K个点
for i in range(K):
    if distance[i] in distance_A:
        number_A += 1
    if distance[i] in distance_B:
        number_B += 1
print("最终结果:")
print("距离待测数据最近的K={:}个数据中,A类数据有{:}个,B类数据有{:}个".format(K,number_A,number_B))
if number_A > number_B:
    print("所以K={:}时,待测数据划分为A类".format(K))
else:
    print("所以K={:}时,待测数据划分为B类".format(K))

#画图
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
for i in range(len_A):#A类,用红色三角形表示
    if i!=len_A-1:
        plt.plot(data_A[i][0],data_A[i][1],'bo',marker='^',color='red')
    else:
        plt.plot(data_A[i][0],data_A[i][1],'bo',marker='^',label='A',color='r')
    #使用if..else...是为了避免在图形中重复出现多个标签
for i in range(len_B):#B类,用蓝色正方形表示
    if i!=len_B-1:
        plt.plot(data_B[i][0],data_B[i][1],'bo',marker='s',color='blue')
    else:
        plt.plot(data_B[i][0],data_B[i][1],'bo',marker='s',label='B',color='b')
plt.plot(test_data[0][0],test_data[0][1],'bo',label='待测数据',color='g')#测试集
plt.xlim(0,10)
plt.ylim(0,10)
plt.legend()
plt.show()

运行结果
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值