文章目录

  • 前言
  • 一、KNN分类算法
  • 1.1 引入数据**加粗样式**
  • 1.2 可视化
  • 二、KNN算法实现



前言

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


一、KNN分类算法

Python项目科学计算器 python科学计算的例子_机器学习

1.1 引入数据加粗样式

Python项目科学计算器 python科学计算的例子_python_02

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

Python项目科学计算器 python科学计算的例子_算法_03


Python项目科学计算器 python科学计算的例子_机器学习_04

总共150中朵莺尾花,故因给对应150个target
但只有三个种类 每种莺尾花都有它对应的种类

Python项目科学计算器 python科学计算的例子_Python项目科学计算器_05

1.2 可视化

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

  • 安装库

Python项目科学计算器 python科学计算的例子_机器学习_06


Python项目科学计算器 python科学计算的例子_Python项目科学计算器_07


Python项目科学计算器 python科学计算的例子_可视化_08


Python项目科学计算器 python科学计算的例子_Python项目科学计算器_09

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

Python项目科学计算器 python科学计算的例子_Python项目科学计算器_10

二、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朵莺尾花的的距离

Python项目科学计算器 python科学计算的例子_算法_11

  • 测试结果展示:

Python项目科学计算器 python科学计算的例子_算法_12


Python项目科学计算器 python科学计算的例子_机器学习_13

  • 函数封装

Python项目科学计算器 python科学计算的例子_python_14

  • 类的封装
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])

Python项目科学计算器 python科学计算的例子_python_15


这里还涉及准确度的问题