【人工智能算法】算法基础之K均值聚类算法

本文重点主要有:

  • 聚类
  • 质心
  • 非监督训练
  • K均值算法

理解训练集

多组观测值通常被划分为称作“训练集”的大型集合,这些数据都被用于训练机器学习算法。“训练”指的是通过调整算法的内部状态,使得机器学习算法的输出符合预期输出的过程。
按所使用的训练集不同,机器学习算法宽泛地分为两类:监督学习和非监督学习。在非监督学习过程中,你仅仅向算法提供向量形式的输入数据,但却不设置预期输出;聚类算法就是一种非监督学习。

非监督学习

以鸢尾花的数据集为例来了解监督学习和非监督学习的过程。
这个数据集由与鸢尾花花瓣和花萼尺寸有关的4个比率量组成,还有一个“种属”量指明了每个鸢尾花的种类。
示例如下:
数据集
就非监督的聚类算法而言,我们最可能用到的是前4个量而忽略“种属”这个量。在进行比较之后我们可能会给这些数据打上标签,但由于是非监督学习,聚类算法并不需要知道哪个数据属于哪个“种属”。这个算法的目的不在于判断某个鸢尾花属于什么种类,而在于按相似度把这些数据分为几簇。
另外还要注意一个问题,就是这4个观测值都不必进行归一化,K均值聚类算法本身并不需要归一化的过程;当然这并不是说别的算法也不需要。就对这个鸢尾花数据集进行聚类的问题而言,归一化的过程是可有可无的。要是数据的一个或多个特征量过大,以致掩盖了其他的特征量,就一定要先将数据归一化;在本例中,鸢尾花数据集的四个比率量特征值在数值上都比较接近,因此并不一定要将数据进行归一化处理。
鸢尾花数据集中的4个比率量特征值提供的信息并不足以将它按“种属”分类;这完全没有关系,就聚类这个操作而言,我们只是想看看这些数据之间到底有多相似,以及这些数据究竟可以被分为多少组。
聚类结果
在上图中,各个分好的簇按颜色在图上标注了出来,并且都用曲线围了起来,以便在黑白媒介上也能够区分这些簇。
如果聚类算法能够正确地区分鸢尾花的种类,那么同种符号就应当是同样的颜色;
我们可以看到的簇与簇之间边界十分明晰,但很显然它们并不是按照“种属”这个属性来划分的,这一点几乎无法避免。由于随机性,K均值算法有时确实会得到与按种类划分相近的结果。在上图中簇与簇之间是线性可分的(“线性可分”的意思是可以通过画一条直线把它们分隔开来),而鸢尾花的不同种类之间却不是线性可分的。种类与种类之间存在一部分重叠的区域,仅靠非监督的聚类算法是不可能将两个种类区分开来的。

监督学习

监督学习的限制比非监督学习要高一些,其中的训练集要由输入数据和预期输出组成的成对数据构成。就鸢尾花数据集而言,你要输入4个比率量观测值作为一个四维输入向量,可能还需要用突显编码法将“种属”数据编码为预期输出向量。机器学习算法的性能由给定输入时,产生对应的预期输出的比例来评估。

理解K均值算法

K均值算法实现起来比较简单,效果主要是将数据划分为指定数量的集群。其中,算法的实现有3个泾渭分明的步骤:

  • 初始化(两种方法)
  • 分配
  • 更新

分配

“分配”和“更新”两步会不断重复,直到再也没有新的数据需要划分到新的簇中。每一个簇都会从两方面来定义。首先是“质心”。“质心”也是一个与被聚类数据等长的向量,实际上其本身就是一个数据,只不过表示的是簇内数据的平均值。因此,“质心”究其本质是簇内所有数据的中心点。除了“质心”外,每个簇还有一个由分配给各个簇的数据组成的列表。
“分配”这一步会对所有数据进行循环,并把每个数据分配到其质心与该数据最接近的簇中去。其中“最近”指的

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我来为您解答。 首先,初始化一个4维向量可以使用Python的列表(list)来实现。例如,以下代码演示了如何创建一个包含4个0的向量: ``` vector = [0, 0, 0, 0] ``` 接下来,让我们来看一下如何使用K均值聚类算法实现对数据的聚类。K均值聚类是一种常用的无监督学习算法,它通过将数据分成K个不同的簇来实现聚类。 以下是使用Python实现K均值聚类的示例代码: ```python import numpy as np # 定义K均值聚类算法 def kmeans(X, k, max_iters=100): # 随机初始化质心 centroids = X[np.random.choice(range(len(X)), k)] for i in range(max_iters): # 计算每个样本到质心的距离 distances = np.sqrt(((X - centroids[:, np.newaxis]) ** 2).sum(axis=2)) # 找到距离每个样本最近的质心 closest_centroids = np.argmin(distances, axis=0) # 重新计算质心 for j in range(k): centroids[j] = X[closest_centroids == j].mean(axis=0) return centroids, closest_centroids # 测试K均值聚类算法 X = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]) k = 2 centroids, closest_centroids = kmeans(X, k) print("质心:", centroids) print("每个样本所属的簇:", closest_centroids) ``` 在上述代码中,我们使用了NumPy库来进行数据处理和计算。首先,我们随机初始化了K个质心,然后循环执行以下步骤: 1. 计算每个样本到质心的距离。 2. 找到距离每个样本最近的质心。 3. 重新计算质心。 重复上述步骤,直到算法收敛或达到最大迭代次数。 最后,我们输出了计算出的质心和每个样本所属的簇。 希望上述代码能帮到您,如有疑问请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值