【机器学习】十大算法之一 “K-means”

简介: k-means算法早在1957年就被发明了,最早由J. MacQueen提出。后来,Lloyd(1982年)、Hartigan(1975年)、Forgy(1965年)等学者对此算法进行了修正和改进。这个算法已被广泛应用于数据挖掘、模式识别、图像处理等领域,它可以用来识别数据集之间的模式,因此是一种十分实用的机器学习算法。本篇文章介绍了k-means算法,一种常见的聚类算法。我们详细讲解了该算法的发展史、原理、功能以及示例代码。

机器学习是一种能够让计算机在不接收显式编程的情况下自主学习的技术。在机器学习的各种算法中,k-means算法是一种常见的聚类算法,它可以将一组数据分成多个不同的类别,并且属于同一类别的数据彼此之间具有高度的相似性。

本文将详细讲解机器学习十大算法之一 “K-means”

image.png
一、简介
k-means算法早在1957年就被发明了,最早由J. MacQueen提出 。后来,Lloyd(1982年)、Hartigan(1975年)、Forgy(1965年)等学者对此算法进行了修正和改进。这个算法已被广泛应用于数据挖掘、模式识别、图像处理等领域,它可以用来识别数据集之间的模式,因此是一种十分实用的机器学习算法。

二、发展史
k-means算法是基于传统的聚类分析技术而发展起来的。聚类分析在早期主要应用于社会学、心理学和生物学等领域,用来发现自然类或发现结果变量。
k-means算法的思想具有很强的几何直觉,最早是由Lloyd于1957年提出,并用于电话网络分割应用,它的主要思想是通过迭代方法将数据聚成k个类别,每个类别由一个中心点表示。

Lloyd的k-means算法的初始版本可以被描述如下:
随机选择k个点,作为初始的k个聚类的中心。

将每个点分配到距离最近的聚类中心所代表的聚类。

针对每个聚类重新计算聚类中的所有点的平均值,作为新的聚类中心。

重复步骤2和3,直到聚类中心不再发生变化或者是经过了预定的迭代次数。
在Lloyd算法之后,Hartigan和Wong提出了两个改进的k-means算法,分别是k-means++和k-medoids。
k-means++算法的主要思想是在选择初始点时尽可能的均匀分布整个数据集。在k-medoids算法中,每个聚类的中心不是由聚类内的所有点的平均值计算而成,而是由聚类内的某个代表点计算而成,这个代表点也称为medoids。
现在,k-means算法已经成为了一种十分流行地聚类算法,也被广泛应用于各个领域。

三、算法原理详解
k-means算法是一个迭代聚类算法,主要包括以下几个步骤:
随机选择k个数据点作为初始聚类中心。

对于剩下未被选择的数据点,将其与k个聚类中心距离找到最接近的那个,并将其加入该聚类。

根据新的数据点的加入更新聚类中心。

重复上述过程,直至聚类中心不再发生变化为止或达到预设的迭代次数。
简而言之,k-means算法通过最小化所有数据点到其所属聚类中心的距离平方和(SSE),来不断迭代更新聚类中心以达到聚类效果。

具体算法流程:
随机选择k个数据点作为初始聚类中心。

对每个数据点,都计算其到全部k个聚类中心的距离。然后将该数据点分配给距离最近的那个聚类中心所代表的聚类。

针对每个聚类重新计算聚类中的所有点的平均值,作为新的聚类中心。

重复步骤2和3,直到聚类中心不再发生变化或者是经过了预定的迭代次数。

下面我们依次对以上几个步骤进行解析。
1.初始聚类中心
为了开始聚类过程,我们需要先指定k(即要将数据集聚类成k个类别)。然后从数据集中随机选择k个数据点作为初始聚类中心。
2.分配到最近聚类中心
接下来的步骤是将其它数据点和初始的聚类中心进行比较,然后将它们分配到它们离得最近的聚类中心所代表的聚类。这个过程通常被称为“簇的分配”。
该过程可以由以下的式子来计算。

image.png
其中,xi​ 代表第i个数据点, cj​ 代表第j个聚类中心。
下面详细解析:
对于数据集中的一个数据点xi​,计算其到聚类中心cj​的欧氏距离:
image.png
其中,n是每个数据点的特征数量。
数据点xi​被分配给距离最近的聚类中心cj​所代表的聚类,即xi​被分配到聚类j中去。
3.重新计算聚类中心
将数据点分配给聚类之后,我们需要重新计算每个聚类中的所有点的平均值,作为新的聚类中心。这个过程是一个迭代过程,对于每个聚类都要执行一次。
给定聚类j及其所有数据点的集合S={x1​,x2​,......,x∣S∣​},新的聚类中心cj​可以计算为:

image.png
其中,|S|是聚类的大小,表示其包含的数据点的数量。
4.重复聚类过程
聚类过程完成后,需要检查聚类的中心是否发生了改变。如果任意一个聚类的中心发生了改变,那么我们需要重新执行分配数据点和重新计算聚类中心的过程。
聚类过程需要重复执行以上的步骤,直至聚类中心不再发生变化或者是达到预设的迭代次数。
四、算法功能详解
k-means算法的主要功能是实现数据点的聚类,用来将数据集划分成k个不同的类别。它的应用领域非常广泛,比如人脸识别、数据挖掘、社交网络分析等。
在具体的应用过程中,k-means算法的结果可以:

帮助研究者发现不同观察或实验对象之间的相似性和不同之处。

帮助企业分析用户行为,提升销售和服务质量。

通过对大规模数据的聚类,从数据中提取出有用的信息,为业务决策提供依据。

将项目中的应用程序划分成不同的类别,便于维护和支持。

五、示例代码
为了演示k-means算法的应用,我们针对一个简单的数据集进行聚类分析。
在这个示例中,我们使用Python的scikit-learn库来实现k-means算法。这个库已经内置了众多的机器学习算法,包括k-means算法。
1.安装相关库


pip install matplotlib

pip install -U scikit-learn

2.分布讲解
首先,我们需要导入一些必要的库并加载数据。在这个示例中,我们使用sklearn库中的make_blobs函数来生成带有标签的聚类数据。


import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 生成带有标签的聚类数据
X, y = make_blobs(n_samples=500, n_features=2, centers=4, random_state=10)

接下来,我们将数据可视化,颜色代表每个数据点所属的聚类。


# 可视化数据集,颜色代表聚类标签
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.5)
plt.title('Original Data')
plt.show()

image.png
我们可以看到,数据呈现簇状分布,我们需要将其聚成4类。
然后,我们使用KMeans类中的fit_predict方法来执行k-means算法。


# 执行k-means算法
kmeans = KMeans(n_clusters=4, init='random', max_iter=100, n_init=1)
y_pred = kmeans.fit_predict(X)

在这里,我们指定要将数据聚成4个类别。max_iter代表每次迭代的最大次数。n_init代表KMeans类执行k-means算法的次数。每次迭代之后,我们可以通过使用KMeans类中的clustercenters属性,来获取每个类别的中心。


# 获取聚类中心
centroids = kmeans.cluster_centers_
# 可视化聚类结果,颜色代表聚类标签
plt.scatter(X[:, 0], X[:, 1], c=y_pred, alpha=0.5)
# 可视化聚类中心
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=100)
plt.title('K-means Clustering Result')
plt.show()

image.png
最后,我们可以看到,k-means算法成功将数据点聚成了4类,并将每个类别的中心用红色标出。
3.完整代码


# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 生成带有标签的聚类数据
X, y = make_blobs(n_samples=500, n_features=2, centers=4, random_state=10)
# 可视化数据集,颜色代表聚类标签
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.5)
plt.title('Original Data')
plt.show()

# 执行k-means算法
kmeans = KMeans(n_clusters=4, init='random', max_iter=100, n_init=1)
y_pred = kmeans.fit_predict(X)

# 获取聚类中心
centroids = kmeans.cluster_centers_
# 可视化聚类结果,颜色代表聚类标签
plt.scatter(X[:, 0], X[:, 1], c=y_pred, alpha=0.5)
# 可视化聚类中心
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=100)
plt.title('K-means Clustering Result')
plt.show()

六、总结
本篇文章介绍了k-means算法,一种常见的聚类算法。我们详细讲解了该算法的发展史、原理、功能以及示例代码。在应用中,k-means算法一般用于数据聚类和模式识别,可以帮助我们从数据中提取出有用的信息,为业务决策提供依据。
为了更好地应用k-means算法,我们需要了解它的优点和缺点。
k-means算法的优点:
算法简单,易于实现;

可以处理非常大的数据集;

可以应用于各种领域,有很广泛的应用。
k-means算法的缺点:
需要人为指定k;

对于初始聚类中心的选择,很敏感;

对于非凸形数据集聚类效果不好;

迭代次数及聚类中心的选择都会影响算法的运行速度。
尽管k-means算法有一些缺点,但它在实际应用中表现出色。因此,我们需要理解其原理、功能和使用方法,以便更好地应用它。
image.png

目录
相关文章
|
23天前
|
机器学习/深度学习 算法 数据挖掘
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结
|
1天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
11 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
14天前
|
机器学习/深度学习 数据采集 算法
数据挖掘和机器学习算法
数据挖掘和机器学习算法
|
17天前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
113 1
|
23天前
|
机器学习/深度学习 算法 数据挖掘
机器学习必知必会10大算法
机器学习必知必会10大算法
|
24天前
|
机器学习/深度学习 算法 数据挖掘
【白话机器学习】算法理论+实战之决策树
【白话机器学习】算法理论+实战之决策树
|
22天前
|
机器学习/深度学习 存储 算法
图解最常用的 10 个机器学习算法!
图解最常用的 10 个机器学习算法!
|
1月前
|
机器学习/深度学习 存储 人工智能
【数据挖掘】2022年2023届秋招知能科技公司机器学习算法工程师 笔试题
本文是关于2022-2023年知能科技公司机器学习算法工程师岗位的秋招笔试题,包括简答题和编程题,简答题涉及神经网络防止过拟合的方法、ReLU激活函数的使用原因以及条件概率计算,编程题包括路径行走时间计算和两车相向而行相遇时间问题。
59 2
【数据挖掘】2022年2023届秋招知能科技公司机器学习算法工程师 笔试题
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
基于python 机器学习算法的二手房房价可视化和预测系统
文章介绍了一个基于Python机器学习算法的二手房房价可视化和预测系统,涵盖了爬虫数据采集、数据处理分析、机器学习预测以及Flask Web部署等模块。
基于python 机器学习算法的二手房房价可视化和预测系统
|
1月前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】机器学习的基本概念、算法的工作原理、实际应用案例
机器学习是人工智能的一个分支,它使计算机能够在没有明确编程的情况下从数据中学习并改进其性能。机器学习的目标是让计算机自动学习模式和规律,从而能够对未知数据做出预测或决策。
44 2