机器学习--KNN算法概述(1)无项目

KNN算法概述

问题

image-20231228105042708

计算新事件与数据集的距离,来划分为是什么策略

流程图

image-20231228104617588

代码与运行结果

用的是Jupyter 来写,每一步可视化比较方便看结果

from numpy import *
import operator

import matplotlib.pyplot as plt 
def   createDataSet():  #创建数据集
    group=array([[20,3],[15,5],[18,1],[5,17],[2,15],[3,20]])
    labels=["服务策略","服务策略","服务策略","平台策略","平台策略","平台策略"]
    return group,labels


if __name__=="__main__":
    group,labels=createDataSet()
    x=[item[0]for item in group[:3]]   #列表推导式 item 是点(x,y)列表,item[0]获取x坐标
    y=[item[1]for item in group[:3]]   #列表推导式是 Python 中一种强大的工具,可以用于快速生成和转换列表,使代码更简洁易读。
    plt.scatter(x,y,s=30,c="b",marker="o")  #创建散点图
    x=[item[0]for item in group[3:6]]
    y=[item[1]for item in group[3:6]]
    plt.scatter(x,y,s=100,c="b",marker="x")
    plt.show()
    a=classify([4,17],group,labels,3)
    print(a)

image-20231228104747698

#knn算法
def classify(in_x,datas,labels,k):
    data_size=datas.shape[0]  #获取数据行数
    diff_mat=tile(in_x,(data_size,1))-datas  #输入x复制,与原数据集相减
    sqrt_diff=diff_mat**2  #计算输入数据与每个数据集中的数据点之间的差值。 这里自动计算x^2 , y^2 相当于已经减了原数据,只不过分步算
    sub_distances=sqrt_diff.sum(axis=1)    #第一维度1是行 第二维度0是列  这是按照行加和
    distances=sub_distances**0.5
    sorted_distances=distances.argsort() #返回的是原数组中元素按升序排列后的索引值数组  np.flipud(np.argsort(arr)) 沿着垂直方向翻转数组得到递减

    class_count={}  #创建空字典,存储每个类别的投票次数
    for i in range(k):
        votel_label=labels[sorted_distances[i]]  #获取第i个邻居的标签
        class_count[votel_label]=class_count.get(votel_label,0)+1 #字典中键 votel_label 对应的值,如果该键不存在,则返回默认值 0。
                           
    sorted_class_count=sorted(class_count.items(),key=operator.itemgetter(1),reverse=True)
    #sort 默认递增 ,加了reverse=True 递减
    #class_count.items() 将字典 class_count 转化为包含键值对的列表。
    #key 按照投票次数排序。
    return sorted_class_count[0][0]  #返回最终分类结果

优点缺点

优点:
  1. 简单直观: KNN 是一种直观的算法,易于理解和实现。它不需要模型训练的过程,只需要记住数据。
  2. 无需训练: 不像一些其他机器学习算法需要花费大量时间在训练模型上,KNN 不需要显式的训练过程。
  3. 适用于多类别问题: KNN 在多类别问题上表现良好,尤其是在类别之间的决策边界不明显时。
  4. 适用于小数据集: 对于小型数据集而言,KNN 的计算效率通常较高。
  5. 对异常值不敏感: KNN 对异常值不太敏感,因为它是基于邻近的投票机制。
缺点:
  1. 计算开销大: 在预测时,需要计算未知点与所有已知点的距离,这可能在数据集较大时变得非常耗时。
  2. 存储空间大: 需要存储整个训练集,对于大型数据集来说,这可能占用较大的存储空间。
  3. 需要调参: 需要选择合适的邻居数 k,选择不当可能导致过拟合或欠拟合。
  4. 灵敏度高: 对输入数据的噪声和不相关特征敏感,可能导致不稳定的预测结果。
  5. 维度灾难: 在高维空间中,样本之间的距离变得模糊,KNN 的性能可能下降。
  6. 不适用于非度量空间: KNN 基于距离的度量,对于非度量空间(例如图像)可能不太适用。

总体而言,KNN 在一些特定场景下表现出色,但在大规模高维数据集上可能不是最佳选择。在实际应用中,需要根据问题的特点和数据集的规模来选择适当的算法。

项目

(暂时还未找到合适的项目学习) 到时候学到了再扩充

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值