KNN算法原理以及实例

目录

前言

一、KNN算法介绍

二、KNN算法原理

1.原理

2.欧氏距离

3.曼哈顿距离

三、KNN算法实例

1.代码

2.结果

总结



前言

记录学习KNN算法


一、KNN算法介绍

KNN(K-Nearest Neighbor,k近邻)算法是一种基本的分类与回归方法,它的基本思想是:在特征空间中,如果一个样本的k个最近邻居大多数属于某一类别,则该样本也属于这一类别。

在KNN算法中,首先需要度量样本之间的距离,通常采用欧氏距离或曼哈顿距离。然后,选择一个合适的k值(一般通过交叉验证选取),对于每个待分类的测试样本,在训练数据集中找到其k个最近邻居,根据它们所属的类别进行投票,得票最多的类别即为该测试样本的分类结果。

KNN算法简单易实现,但是在处理大规模数据时计算量较大,因此需要考虑优化计算效率,如通过树形结构(KD树)等方式加速搜索最近邻居的过程。

二、KNN算法原理

1.原理

KNN算法的原理就是新来的样本距离该样本最近的K个样本为他们自己所在的类型投票,票数最多的类型作为新来的样本的类型

例:

当k为3的时候距离×(新来的样本)最近的三个样本都为🔴,因此将×(新来的样本)归类为🔴

当k为3的时候距离×(新来的样本)最近的五个样本种有四个为🔴,一个为🔵,多数为🔴,因此将×(新来的样本)归类为🔴

2.欧氏距离

欧式距离就是两点之间连线的距离

3.曼哈顿距离

                                

曼哈顿距离是两点之间在每个轴上相差的绝对值的和


三、KNN算法实例

1.代码

#导包
import numpy as np
import matplotlib.pyplot as plt
#KNN算法
def knn(newInput, dataSet, labels, k):
    # 计算欧氏距离
    distances = np.sqrt(np.sum((dataSet - newInput) ** 2, axis=1))
    #将距离进行排序
    sortedDistancesIndices = distances.argsort()
    #创建空数组
    k_labels = []
    #循环取出前k个样本,并将样本的类型存入 k_labels数组
    for i in range(k):
        k_labels.append(labels[sortedDistancesIndices[i]])
    # 对k个样本的类型进行比较,返回最多的类别作为新样本的类别
    return max(k_labels, key=k_labels.count)
# 测试代码
dataSet = np.array([[1.0, 1.1],
                    [1.0, 1.0],
                    [0.0, 0.0],
                    [0.1, 0.1]])
labels = ['A', 'A', 'B', 'B']
newInput = np.array([0.6, 0.7])
k = 3
result = knn(newInput, dataSet, labels, k)
print("分类结果为:", result)
# 绘制散点图
#创建散点图窗口和坐标绘制
fig, ax = plt.subplots()
#将dateSet中的第一列和第二列分别作为X轴和Y轴并把A类点用绿色,B类点用蓝色
ax.scatter(dataSet[:,0], dataSet[:,1], c=[{'A': 'g', 'B': 'b'}[label] for label in labels])
#将newInput中的第一位和第二位分别作为X轴和Y轴并根据分类A类点用绿色,B类点用蓝色绘制×在散点图上
ax.scatter(newInput[0], newInput[1], c=[{'A': 'g', 'B': 'b'}[result]], marker='x')
#设置X轴和Y轴的名称
ax.set_xlabel('X')
ax.set_ylabel('Y')
#设置图像标题
ax.set_title('KNN')
#绘制图像
plt.show()

2.结果

总结

KNN算法简单而直观,容易理解和实现。但在实际应用中需要注意参数K的选择,距离公式的选择等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值