Code前端首页关于Code前端联系我们

机器学习是一个简单的kNN算法,用Python代码实现

terry 2年前 (2023-09-27) 阅读数 65 #数据结构与算法

相比爬虫,机器学习的控制更加实用和有竞争力

如今,网络上的这些教义大多对新手并不友好。他们要么直接调用Sklearn包,要么充满抽象枯燥的算法公式。看完这些教程后很难上手,真正适合初学者的手写Python编码教程少之又少。 。我最近在 MOOC.com 上观看了bobo和老师的《机器学习》。它是最好的机器学习课程之一。我计划根据他的教学和我自己的理解很快更新高音机器学习系列。

第一条推文,我们先不讲什么是机器学习、机器学习的算法之类的总结性文章。在你不知道它是什么之前,读完这些你不会有任何感觉,但它会增加你的心理健康。商品。

那我就直接从实用的算法开始吧,就像之前的爬虫教程一样。只有当你真正感受到它的乐趣时,你才会有学习它的欲望。

让我们从一个场景故事开始吧。

01场景转换

酒吧里有十杯几乎和酒吧一样大的红酒。老板开玩笑地问你要不要玩游戏。如果你赢了,你可以免费喝酒。如果输了,您将支付酒水价格的 3 倍。概率是50%。你是一个大胆的人。

老板继续说道:你面前的这十杯红酒都略有不同。前五杯属于“赤霞珠”,后五杯属于“黑皮诺”。现在,我又倒了一杯酒,你需要根据这十杯酒准确地告诉我它属于哪一类。

听到这里,你会感到有点愧疚:你从来都不懂酒,光靠看和尝是无法分辨出区别的。然而,如果你记得自己是从事机器学习的,你就会情不自禁地更加自信,并且很容易认同老板的观点。

你没有急着品尝酒而是向老板询问每杯酒的具体信息:酒精浓度、颜色深浅等,还有纸和笔。当你制定计划时,老板会给你倒一杯新酒。很快你就会告诉你的老板,新酒应该是“赤霞珠”。

老板瞪大了眼睛,惊得下巴都快掉下来了。没有人在品尝过一款酒之前就能得到一个好的答案。无数人一遍又一遍地尝试,最终却产生了怀疑和错误的预测。你神秘一笑,老板信守诺言,让你喝个痛快。当你累了的时候,你的老板最终会情不自禁地来找你,看看你是怎么做到的。

你出现了:没别的,但是机器学习是你习惯的


02 kNN 算法介绍

接下来,我们将从这个故事开始联系机器学习。机器学习对很多人来说都感觉“难”,所以我编了上面的故事来介绍机器最简单的学习算法之一:kNN算法(K-Nearest Neighbor),也叫K-Nearest Neighbor算法。

不要害怕“算法”这个词。我保证只要你有高中数学和Python基础知识你就能学会这个算法。

学习kNN算法只需要三个步骤:

  • 理解kNN算法的概念
  • 了解其背后的数学原理(别担心,你高中就学过)
  • 最后,使用简单的Python代码实现它

在讲kNN算法之前,我们先讲两个概念:样本和特征。

上面的每杯酒称为“样品”,十杯酒是样品的集合。酒精浓度和颜色深度等信息称为“特征”。这十杯酒分布在一个多功能的环境中。如果我们谈论空间,我们可以看到最三维的空间。为了便于理解,我们假设为了区分赤霞珠和黑皮诺,我们必须只使用两个特征值:酒精浓度和颜色深度。这可以在二维坐标轴上可视化。 机器学习简单 kNN 算法,Python代码实现

横轴为酒精浓度值,纵轴为颜色深度值。十杯葡萄酒在轴上形成十个点,其中五个绿色点代表五杯赤霞珠,五个红色点代表五杯黑皮诺。可见,这两类酒之间有着明显的界限。老板新倒的一杯酒就是图中的黄点。

还记得我们的问题吗?要判断这杯酒是赤霞珠还是黑皮诺,答案就很明确了。从主观上看,应该是赤霞珠。

这使用了K最近算法的概念。 这个算法首先需要得到一个参数K。分配给机器学习的经验值为3。我们假设先取3。具体数字稍后讨论。对于每一个新点,最近K算法就是在所有样本点中找到距离新点最近的三个点,统计这三个点的类别,然后进行选择和统计。得票最多的类别就是新点。类别。 机器学习简单 kNN 算法,Python代码实现

上图有两类:绿色和红色。最接近黄色的三个点都是绿色点,所以绿色和红色类别的票数是3:0,绿色获胜,所以黄色点属于绿色,即新杯属于赤霞珠长相思。

这是最接近的K 算法。其内容是判断两个样本的距离是否相同。如果距离接近,则认为它们相等,属于同一类别。当然,只比较一个样本是不够的,因为误差会很大。你需要比较最近的K个样本,看看这K个样本中哪一个最常见,然后确定新样本属于哪个类别。

是不是很简单呢?

再比如,老板又倒一杯酒让你再猜。你可以在坐标轴上画出它的位置。距离他最近的三个点是两个红点和一个绿点。红绿比例为2:1,红色获胜,所以K近邻算法告诉我们,这杯酒很可能是黑皮诺。 机器学习简单 kNN 算法,Python代码实现

可以看到K近邻算法是通过距离来解决分类问题的。我们这里解决的两个分类问题,实际上,最接近的K算法非常适合解决多分类问题。另外,它也适合解决回归问题,稍后将详细讨论。


02 数学理论

K 我们知道了最近邻算法的基本思想,我们来看看它背后的数学原理。该算法中的“距离”是二维坐标轴上两点之间的距离。计算距离的公式有很多。一般来说,经常使用欧拉公式。我们在高中学过这个:机器学习简单 kNN 算法,Python代码实现

解释是:m和n两个点,它们的距离等于x和y坐标之间的平方差之和的平方根。

如果三维坐标中的z坐标较多,则距离计算公式也相同: 机器学习简单 kNN 算法,Python代码实现

当组成多个空间的特征较多时,很难将其写在x y z中。我们改成 X 加下标来表示特征的维数,这样 n 维空间中两点的距离公式可以写为: 机器学习简单 kNN 算法,Python代码实现

公式可以简化为: 机器学习简单 kNN 算法,Python代码实现

这个 kNN 算法是数学上的原理,不难吧?

只需计算新的样本点与样本集中每个样本之间的坐标距离,然后对距离最短的3个点进行排序和过滤,并统计这3个点的类别。数字最高的是新样品的葡萄酒类别。 。

根据欧拉公式,我们可以使用非常基本的Python来实现。

03 Python代码实现

首先,随机放置十个样本点,代表十杯酒。这里我从 Sklearn 中的葡萄酒数据集中获取了样本点。该数据集常用于以下算法中。慢慢进入。

1导入 numpy as np

2X_raw = [[14.23, 5.64],,,3.3] 4 [13.16, 5.68],5 [14.37, 4.80],

6 [13.24, 4.32],

7 [12.07, 2.76],

8,

8,

8,

8,

8 8, ”12.4 1.79, 3 . ],

10 [12.37, 2.12],

11 [12.04, 2.6 ]]

12

13y_raw = [0, 0, 0, 0, 0, 1]1, 1, X_raw 值两列分别是颜色深度和酒精浓度值。 y_raw中的0代表黑皮诺,1代表赤霞珠。

新酒杯信息:

1x_test = ([])

在机器学习中,经常使用numpy数组代替列表,因为数组速度快,并且可以进行向量运算,所以在'操作之前将上面的内容转换一下列表到编号:

1x_train=(x_raw)

2y_train=(y_raw)

带有x y,您可以绘制第一个散点图:

1import

1导入❀❀asplt

2plt.style.use('ggplot')

(figsize=(10.6))

4

5plt.scatter(X_train[y_train==] ,0 ], =100,color=color_r,label='黑皮诺')

(x_test2[0],x_test2[1],s=100 ,color=color_y) # x_test

8

9plt.xlabel('酒精浓度')

('颜色深度')

(loc='右下')

12

13plt.tight_layout()

('酒样.png')

距离计算公式从新的黄色样本点到每个样本点:

1from math import sqrt

2distance = [sqrt(()**) ) for x 9973、

7 1.5558920271021373、3 21373、3 1503、

9 1.9784084512557052、

10 1.5446682491719705,

11 0.54005565 12 0.7294518489934753,

130.4172529209005018,

14 1.215113163454334,

15 0.7011419257183239]在以前的爬虫教程中经常使用。如果不熟悉的话可以公众号搜索“Listist代​关键词回顾

这样就可以将黄色点到每个点的距离计算到最接近的了。有3 个点,可以使用函数返回样本点的索引位置:

1sort = (distance )

2sort

3

4[out]:array([7, 5, 9 . , 1]

可以看到距离黄点最近的3个点都是绿色的赤霞珠,与肉眼观察的不同。Counter函数统计并返回类别值:

1来自收藏 import Counter

2votes = top3

4[out]:Counter({1: 3} )

5

6predict_y = (1)[0][0]

7predict_y

8 [输出]:1♿♸为最终分级1,即新酒为赤霞珠。

我们在Python脚本中完成了一个简单的kNN算法。这不是很难吗?

如果你觉得这很难,我们看一个更简单的方法:调用sklearn库中的kNN算法,也称为包调整。只需 5 行即可得出相同的结论。

04 sklearn 传输包

1来自 sklearn。邻居导入KNeighborsClassifier♿_分类器♿__neighbors = 3)

(X_train,y_train)

4x_test =(1,-1)

(x_)测试)[0]

6

7[ out]: 1

首先从sklearn导入kNN分类算法函数KNeighborsClassifier并设置模型。最近K个样本数n_neighbors设置为3,接下来fit训练模型,最后预测模型得到分类结果1,和新手写代码一样,我们写的。

正如你所看到的,虽然sklearn封面编辑很简单,但是作为初学者,最好了解其背后的算法原理,然后通过Python代码应用它,这样你就可以开始机器学习迅速地。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门