【机器学习】十大算法之一 “K-means”
k-means算法早在1957年就被发明了,最早由J. MacQueen提出。后来,Lloyd(1982年)、Hartigan(1975年)、Forgy(1965年)等学者对此算法进行了修正和改进。这个算法已被广泛应用于数据挖掘、模式识别、图像处理等领域,它可以用来识别数据集之间的模式,因此是一种十分实用的机器学习算法。本篇文章介绍了k-means算法,一种常见的聚类算法。我们详细讲解了该算法的发
持续分享:机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。
如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666@foxmail.com
机器学习是一种能够让计算机在不接收显式编程的情况下自主学习的技术。在机器学习的各种算法中,k-means算法是一种常见的聚类算法,它可以将一组数据分成多个不同的类别,并且属于同一类别的数据彼此之间具有高度的相似性。
本文将详细讲解机器学习十大算法之一 “K-means”
目录
k-means算法是一个迭代聚类算法,主要包括以下几个步骤:
一、简介
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. 分配到最近聚类中心
接下来的步骤是将其它数据点和初始的聚类中心进行比较,然后将它们分配到它们离得最近的聚类中心所代表的聚类。这个过程通常被称为“簇的分配”。
该过程可以由以下的式子来计算。
其中,xi 代表第i个数据点, cj 代表第j个聚类中心。
下面详细解析:
对于数据集中的一个数据点xi,计算其到聚类中心cj的欧氏距离:
其中,n是每个数据点的特征数量。
数据点xi被分配给距离最近的聚类中心cj所代表的聚类,即xi被分配到聚类j中去。
3. 重新计算聚类中心
将数据点分配给聚类之后,我们需要重新计算每个聚类中的所有点的平均值,作为新的聚类中心。这个过程是一个迭代过程,对于每个聚类都要执行一次。
给定聚类j及其所有数据点的集合S={x1,x2,......,x∣S∣},新的聚类中心cj可以计算为:
其中,|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()
我们可以看到,数据呈现簇状分布,我们需要将其聚成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类中的cluster_centers_属性,来获取每个类别的中心。
# 获取聚类中心
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算法成功将数据点聚成了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算法有一些缺点,但它在实际应用中表现出色。因此,我们需要理解其原理、功能和使用方法,以便更好地应用它。
更多推荐
所有评论(0)