k聚类方法

  • 格式:docx
  • 大小:12.32 KB
  • 文档页数:4

k聚类方法
K-means 聚类方法是机器学习中常用的聚类方法之一,主要应用于数据挖掘、图像分割、模式识别等领域。

K-means 聚类是通过将数据集中的数据分为 k 个簇,每个簇内部的数据相似度较高,不同簇之间数据相似度较低,从而实现数据的聚类分析。

一、K-means算法的基本原理
(一)算法思想:
K-means 算法首先需要从数据集中随机选取 k 个点作为初始的质心。

接着计算每个点到这 k 个质心的距离,将每个点划分到距离最近的质心所在的簇中。

然后重新计算每个簇中所有点的均值,将这个均值作为新的质心。

不断重复这个过程,直到每个簇中心不再变化为止。

最终得到 k 个簇,每个簇中的数据相似性最高,而不同簇之间的数据相似性最低。

(二)算法流程:
1.随机选择 k 个数据作为初始质心;
2.按照与质心距离最近的原则将每个数据划分到一个簇中;
3.重新计算每个簇的质心;
4.重复步骤 2 和步骤 3,直到质心不再改变;
5.得到 k 个簇,每个簇中的数据相似度最高。

(三)算法优缺点:
1.简单易用,计算速度快,可用于大规模数据的聚类分析;
2.仅需要知道簇的数量 k,不需要输入模型的参数;
3.对异常值和噪声敏感,容易受到选取初始质心的影响而陷入局部最优解;
4.当簇的数量 k 很大时,算法的效率会变得非常低,这时可以采用二分 K-means 或谱聚类等算法。

二、K-means算法的实现步骤
1.首先需要导入数据集,将数据集中的数据转换成数组形式,以便于计算距离和均值;
2.根据簇的数量 k 随机初始化质心;
3.计算每个数据点到质心的距离,将每个数据点归入距离最近的质心所在的簇;
4.重新计算每个簇的质心;
5.重复步骤 3 和步骤 4,直到质心不再改变或达到最大迭代次数;
6.得到 k 个簇,将数据进行可视化展示。

三、K-means算法的Python实现
以下是K-means算法的Python实现代码:
```
import numpy as np
import matplotlib.pyplot as plt
def kMeans(dataSet, k, maxIter):
# 获取数据集的总数和特征值的长度
m, n = dataSet.shape
# 随机初始化质心
centroids = np.array([]).reshape(n, 0)
for i in range(k):
# 从数据集中随机选择一个数据,作为初始化的质心
randIndex = int(np.random.uniform(0, m))
# 将这个质心添加到质心矩阵中
centroids = np.c_[centroids, dataSet[randIndex]]
# 初始化簇划分矩阵
clusterAssment = np.mat(np.zeros((m, 2)))
# 迭代计算
for i in range(maxIter):
# 初始化标志变量
clusterChanged = False
# 遍历数据集中的每一个数据
for j in range(m):
# 初始化最小距离和最小距离的簇编号
minDist = float("inf")
minIndex = -1
# 计算数据点到每一个质心的距离
for q in range(k):
dist = np.linalg.norm(dataSet[j, :] - centroids[:, q].T)
# 更新最小距离和最小距离的簇编号
if dist < minDist:
minDist = dist
minIndex = q
# 如果该数据点所属的簇发生了变化,则更新标志变量
if clusterAssment[j, 0] != minIndex:
clusterChanged = True
# 更新该数据点所属的簇编号和距离
clusterAssment[j, :] = minIndex, minDist ** 2
# 如果簇的划分不再发生变化,则退出迭代
if not clusterChanged:
break
# 计算每个簇中所有数据的均值,更新质心
for q in range(k):
dataInCluster = dataSet[np.where(clusterAssment[:, 0] == q)[0]] centroids[:, q] = np.mean(dataInCluster, axis=0).T
print("Cluster complete!")
# 返回质心矩阵和簇划分矩阵
return centroids, clusterAssment
# 导入数据集
dataSet = np.loadtxt("data.txt", delimiter="\t")
# 聚类分析
k = 3
maxIter = 100
centroids, clusterAssment = kMeans(dataSet, k, maxIter)
# 可视化展示
colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k', 'w']
markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']
for i in range(k):
dataInCluster = dataSet[np.where(clusterAssment[:, 0] == i)[0]]
plt.scatter(dataInCluster[:, 0], dataInCluster[:, 1], marker=markers[i], color=colors[i])
plt.scatter(centroids[0, :], centroids[1, :], marker="+", color="k", s=1000)
plt.show()
```
四、K-means算法的应用举例
假设我们有一个数据集,包含两个特征 `X` 和 `Y`,我们需要将这个数据集分为三个簇。

以下是数据集的可视化图像:
我们采用 K-means 算法对数据集进行聚类分析,选择三个质心进行初始化,最大迭代次数为 100。

以下是聚类结果的可视化图像:
我们可以看到,经过 K-means 算法的分析,原始的数据集被分成了三个簇,每个簇中的数据点相似度较高,而不同簇之间的数据点相似度较低。