Python科学计算--KNN算法


前言

邻近算法,或者说K最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据集合中每一个记录进行分类的方法


一、KNN分类算法

在这里插入图片描述

1.1 引入数据加粗样式

在这里插入图片描述

iris.data所显示的数据是二维的
前面两个数据是花萼的长和宽
后面两个数据是花瓣的长和宽
使用shape查看莺尾花的数量

在这里插入图片描述
在这里插入图片描述

总共150中朵莺尾花,故因给对应150个target
但只有三个种类 每种莺尾花都有它对应的种类
在这里插入图片描述

1.2 可视化

散点图可以帮助我们分析不同特征的分布关系
横轴是一个特征,纵轴是一个特征

  • 安装库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单从以上两幅图来看,选哪种作为我们的分类?
主要观察某种特征下的哪种数据聚集性更好,以及交错性差 -------->由此,我们选择花瓣来区分

在这里插入图片描述

二、KNN算法实现

自己创造一个莺尾花数据,并显示
x = np.array([6.0,3.0,4.0,1.4])
新的莺尾花特征数据更接近哪一类,那就是这类别
离新样本点(测试点)最近的K个点,在最近的K个点中,哪一个类别最多,那就是这一种类:人以类聚物以群分

  1. 算距离 坐标系两点间距离:sqrt((x1-x2)^2 +(y1-y1)^2)
  2. 对距离排序取K名
  3. 对这K个样本点进行统计,看得到的哪一类最多

计算x的这一朵莺尾花至150朵莺尾花的的距离

在这里插入图片描述

  • 测试结果展示:

在这里插入图片描述
在这里插入图片描述

  • 函数封装

在这里插入图片描述

  • 类的封装
class KNNClassify:
    def __init__(self,k=7):
        self.k = k
        self._X_train = None
        self._y_train = None
    # 学习训练数据
    def fit(self,X_train,y_train):
        self._X_train = X_train
        self._y_train = y_train
    
    # 分类预测  -- 多个
    def predict(self,X_predict):
        y_predict = np.array([self._predict(x) for x in X_predict])
        return y_predict
    # 分类预测  -- 一个    
    def _predict(self,x_predict):  
            distance = np.sqrt(np.sum((self._X_train-x)**2,axis = 1)) 
            np.partition(distance,k) 
            votes =  Counter(self._y_train[np.argpartition(distance,self.k)[:self.k]])
            return votes.most_common(1)[0][0]   

        
knn =  KNNClassify()
knn.fit(X,y)
y_predict = knn.predict(X)
y_predict
  • 结果:
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, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 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])

在这里插入图片描述
这里还涉及准确度的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胜天半月子

打不打商的无所谓,能帮到你就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值