机器学习---KNN算法

KNN算法介绍

什么是KNN算法

KNN算法,即k-nearlist neighbors,通过寻找K个距离最近的数据,来确定当前数据的大小或者类别

KNN算法分类与回归

KNN分类算法:对于一个待分类的样本,在数据集中找到与它相距最近的K个数据样本,然后根据这K个样本所属类别判断,数量最多的即为待分类样本的预测类别

KNN回归算法:对于一个待预测样本,在数据集中找到与它相距最近的K个数据样本,然后取这K个样本的平均值,得到待预测样本的预测结果

距离公式

1、欧式距离:

二维空间:a点为(x1,y1)b点为(x2,y2)                      

_{}d_{12}=\sqrt{(x_1{}-x_2{})^{2}+(y_{1}-y_{2})^{2}}

三维空间:a点为(x1,y1 ,z1)b点为(x2,y2 ,z2)                      

d_{12}=\sqrt{(x_1-x_2{})^{2}+(y_{1}-y_{2})^{2}+(z_{1}-z_{2})^{2}}

n维空间:a点为(x11,x12 ,…,x1n)b点为(x21,x22,…,x2n)

d_{12}=\sqrt{\sum_{k=1}^{n}(x_{1}-x_{2})^{2}}

2、曼哈顿距离:

二维空间:a点为(x1,y1)b点为(x2,y2)

d_{12}=|x_{1}-x_{2}|+|y_{1}-y_{2}|

 n维空间:a点为(x11,x12 ,…,x1n)b点为(x21,x22,…,x2n)

d_{12}=\sum_{k=1}^{n}|x_{1k}-x_{2k}|

KNN算法优缺点

优点:

1.简单,易于理解,易于实现,无需训练;

2.适合对稀有事件进行分类;

3.对异常值不敏感。

缺点

1.样本容量比较大时,计算时间很长;

⒉.不均衡样本效果较差。

sklearn库

什么是sklearn库

Sklearn (Scikit-Learn) 是基于 Python 语言的第三方机器学习库。它建立在 NumPy, SciPy, Pandas Matplotlib 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。

sklearn的安装

pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/

sklearn的使用

使用sklearn官网APIhttps://scikit-learn.org/  knn算法的介绍  搜索k-nearest neighbors,注意版本1.01.2问题

sklearn中KNN算法的案例实现

下面我们通过一个具体的例子来了解KNN算法:

现已存在一个数据文件datingTestSet2.txt ,为历年大学生的调查问卷表

1列:每年旅行的路程

2列:玩游戏所有时间百分比

3列:每个礼拜消耗零食的重量

4列:学生所属的类别,1表示爱学习,2表示一般般,3表示爱玩。

通过该数据预测大一新生的所属类别

以下是datingTestSet2.txt中的文件

对以上数据进行分类并得出结果

# 导入必要的库
import matplotlib.pyplot as plt  # 用于绘图
import numpy as np  # 用于数值计算和数组操作

# 加载数据
# 使用numpy的loadtxt函数从文件'datingTestSet2.txt'中加载数据
# 假设文件中的数据是以空格或制表符分隔的,每行是一个样本,最后一列是目标变量(标签),其余列是特征
data = np.loadtxt('datingTestSet2.txt')

# 按类别划分数据
# 根据最后一列(目标变量)的值将数据划分为三类
data_1 = data[data[:, -1] == 1]  # 筛选出标签为1的所有样本
a = data[:, -1]  # 获取所有样本的标签列(最后一列)
b = [data[:, -1] == 1]  # 创建一个布尔列表,表示哪些样本的标签为1(这行代码似乎没有实际用途)
data_2 = data[data[:, -1] == 2]  # 筛选出标签为2的所有样本
data_3 = data[data[:, -1] == 3]  # 筛选出标签为3的所有样本

# 创建三维图形
fig = plt.figure()  # 创建一个新的图形
ax = plt.axes(projection='3d')  # 创建一个三维坐标系

# 绘制散点图
# 使用不同的颜色和标记绘制不同类别的样本
ax.scatter(data_1[:, 0], data_1[:, 1], data_1[:, 2], c="#FF0000", marker="o")  # 绘制标签为1的样本,红色圆形
ax.scatter(data_2[:, 0], data_2[:, 1], data_2[:, 2], c="#33FFFF", marker="^")  # 绘制标签为2的样本,青色三角形
ax.scatter(data_3[:, 0], data_3[:, 1], data_3[:, 2], c="#000011", marker="+")  # 绘制标签为3的样本,深蓝色加号

# 设置坐标轴标签
ax.set(xlabel="Xzhou", ylabel="Yzhou", zlabel="Zzhou")  # 设置X、Y、Z轴的标签

# 显示图形
plt.show()  # 弹出窗口显示绘制的三维散点图

结果如下

模型训练

# 导入必要的库
import numpy as np  # 用于数值计算和数组操作
from sklearn.neighbors import KNeighborsRegressor  # 导入KNN回归模型

# 加载数据
# 使用numpy的loadtxt函数从文件'datingTestSet2.txt'中加载数据
data = np.loadtxt('datingTestSet2.txt')

# 划分特征和目标变量
# data[:, :-1] 表示选取所有行,以及除最后一列之外的所有列,作为特征矩阵X
# data[:, -1] 表示选取所有行,以及最后一列,作为目标变量y
X = data[:, :-1]  # 特征矩阵
y = data[:, -1]   # 目标变量

# 初始化KNN回归模型
# 创建一个KNeighborsRegressor对象,设置n_neighbors=10,即使用10个最近邻居进行回归
neigh = KNeighborsRegressor(n_neighbors=10)

# 训练模型
# 使用特征矩阵X和目标变量y来训练KNN回归模型
neigh.fit(X, y)

模型预测

# 预测单个样本
# 对输入样本 [36429, 3.570968, 0.832254] 进行预测
# 注意:输入样本需要是一个二维数组(即使只有一个样本),因为predict方法接受二维数组作为输入
print(neigh.predict([[36429, 3.570968, 0.832254]]))

# 定义多个待预测的样本
# predict_data 是一个包含多个样本的列表,每个样本是一个包含特征值的列表
predict_data = [
    [9744, 11.440364, 0.760461],    # 样本1
    [16191, 0.100000, 0.605619],    # 样本2
    [42377, 6.519522, 1.058602],    # 样本3
    [27353, 11.475155, 1.528626]    # 样本4
]

# 预测多个样本
# 使用训练好的KNN回归模型对predict_data中的多个样本进行预测
# 输出结果是一个包含每个样本预测值的数组
print(neigh.predict(predict_data))

通过以上模型预测最终得出结果

[2.]
[2.1 2.  2.  2.6]

以上就是sklearn中KNN算法的案例实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值