前言

建议使用jupyter打印一步一步进行理解

上代码:

import numpy as np
import pandas as pd

# 这里直接引入sklearn里的数据集,iris鸢尾花
from sklearn.datasets import load\_iris 
from sklearn.model\_selection import train\_test\_split  # 切分数据集为训练集和测试集
from sklearn.metrics import accuracy\_score # 计算分类预测的准确率
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
iris = load\_iris() #  data:array(\[\[5.1, 3.5, 1.4, 0.2\], 基础数据,矩阵 类似于x轴     'target': array(\[0, 0,。。  分类值  类似于y轴
iris
  • 1.
  • 2.

【机器学习】KNN简单原理_深度学习

【机器学习】KNN简单原理_ai_02

【机器学习】KNN简单原理_机器学习_03

df = pd.DataFrame(data = iris.data, columns = iris.feature\_names)
df\['class'\] = iris.target  # 分类
# df\['class'\]
iris.target
  • 1.
  • 2.
  • 3.
  • 4.

【机器学习】KNN简单原理_深度学习_04

df\['class'\] = df\['class'\].map({0: iris.target\_names\[0\], 1: iris.target\_names\[1\], 2: iris.target\_names\[2\]}) # 对分类进行转值
df.head(10)
# df.describe()  
![](https://img2020.cnblogs.com/blog/1781001/202008/1781001-20200805154638242-66279493.png)
  • 1.
  • 2.
  • 3.
  • 4.
x = iris.data

y \= iris.target.reshape(-1,1)  # 一唯数组转成二唯数组 列向量
print(y)
print(x.shape, y.shape)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

【机器学习】KNN简单原理_机器学习_05

# 划分训练集和测试集    random\_state 随机划分个数  stratify 按照y的比例    test\_size 1为总数 划分训练集与测试集的数量
x\_train, x\_test, y\_train, y\_test = train\_test\_split(x, y, test\_size=0.3, random\_state=35, stratify=y)

print(y\_train)
print(x\_train.shape, y\_train.shape)
print(x\_test.shape, y\_test.shape)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

【机器学习】KNN简单原理_ai_06

**2:核心算法实现**
# 距离函数定义 np.abs计算绝对值  sqrt求根
def l1\_distance(a, b):
    return np.sum(np.abs(a-b), axis=1)
def l2\_distance(a, b):
    return np.sqrt( np.sum((a-b) \*\* 2, axis=1) )

# 分类器实现
class kNN(object):
    # 定义一个初始化方法,\_\_init\_\_ 是类的构造方法
    def \_\_init\_\_(self, n\_neighbors = 1, dist\_func = l1\_distance):
        self.n\_neighbors \= n\_neighbors
        self.dist\_func \= dist\_func
    
    # 训练模型方法
    def fit(self, x, y):
        self.x\_train \= x
        self.y\_train \= y
    
    # 模型预测方法
    def predict(self, x):
        # 初始化预测分类数组
        y\_pred = np.zeros( (x.shape\[0\], 1), dtype=self.y\_train.dtype )
        
        # 遍历输入的x数据点,取出每一个数据点的序号i和数据x\_test
        for i, x\_test in enumerate(x):
            # x\_test跟所有训练数据计算距离
            distances = self.dist\_func(self.x\_train, x\_test)
            
            # 得到的距离按照由近到远排序,取出索引值
            nn\_index = np.argsort(distances)
            
            # 选取最近的k个点,保存它们对应的分类类别
            nn\_y = self.y\_train\[ nn\_index\[:self.n\_neighbors\] \].ravel()
            
            # 统计类别中出现频率最高的那个,赋给y\_pred\[i\]
            y\_pred\[i\] = np.argmax( np.bincount(nn\_y) )
        
        return y\_pred
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

3:测试(不理解算法的人,只要会使用就OK了,sklean其实已经帮我们封装好了),与一下测试实例调用差不多

# 定义一个knn实例
knn = kNN(n\_neighbors = 3)
# 训练模型
knn.fit(x\_train, y\_train)
# 传入测试数据,做预测
y\_pred = knn.predict(x\_test)

print(y\_test.ravel())
print(y\_pred.ravel())

# 求出预测准确率
accuracy = accuracy\_score(y\_test, y\_pred)

print("预测准确率: ", accuracy)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

【机器学习】KNN简单原理_ai_07

总结:其实sklean里面的调用都是差不多的,将数据分为训练集数据跟测试数据(测试数据只是验证测试的x对应的y未知数是否正确),设置临近数分类为n,将训练数据放入fit函数进行训练,计算对应的公式,训练后再将需要预测的x轴值调用predict函数进行计算。最后得出预测值