目录
k-means简介
算法是如何快速找到这些簇的?
k-means 算法只能确定线性聚类边界(非线性边界的处理)
当数据量较大时,k-means 会很慢
k-means 聚类算法流程
聚类算法。
聚类算法:直接从数据的内在性质中学习最优的划分结果或者确定离散标签类型。
k-means简介
k-means 算法在不带标签的多维数据集中寻找确定数量的簇。 最优的聚类结果需要符合以下两个假设。 这两个假设是 k-means 模型的基础。 ①“簇中心点”(cluster center)是属于该簇的所有数据点坐标的算术平均值。 ②一个簇的每个点到该簇中心点的距离,比到其他簇中心点的距离短。
from sklearn.datasets._samples_generator import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.show()
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5)
plt.show()
算法是如何快速找到这些簇的?
期望最大化方法包含以下步骤:
(1) 猜测一些簇中心点。
(2) 重复直至收敛。
a. 期望步骤(E-step):将点分配至离其最近的簇中心点。
b. 最大化步骤(M-step):将簇中心点设置为所有点坐标的平均值。
期望步骤(E-step 或 Expectation step)不断更新每个点是属于哪一个簇的期望值。
最大化步骤(M-step 或 Maximization step)计算关于簇中心点的拟合函数值最大化对应坐标(argmax 函数)
在典型环境下,每一次重复 E-step 和 M-step 都将会得到更好的聚类效果。
虽然 E–M 算法可以在每一步中改进结果,但是它并不保证 可以获得全局最优的解决方案。
虽然 E–M 算法最终收敛了,但是并没有收敛至全局最优配置。
因此,该算法通常会用不同的初始值尝试很多遍,
在 Scikit-Learn 中通过 n_init 参数(默认值是 10)设置执行次数。
簇数量必须事先定好
from sklearn.metrics import pairwise_distances_argmin
import matplotlib.pyplot as plt
import numpy as np
def find_clusters(X, n_clusters, rseed=2):
# 1.随机选择簇中心点
rng = np.random.RandomState(rseed)
i = rng.permutation(X.shape[0])[:n_clusters]
centers = X[i]
while True:
# 2a.基于最近的中心指定标签
labels = pairwise_distances_argmin(X, centers)
# 2b.根据点的平均值找到新的中心
new_centers = np.array([X[labels == i].mean(0) for i in range(n_clusters)])
# 2c.确认收敛
if np.all(centers == new_centers):
break
centers = new_centers
return centers, labels
centers, labels = find_clusters(X, 4)
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.show()
k-means 算法只能确定线性聚类边界(非线性边界的处理)
k-means 聚类的边界总是线性的,这就意味着当边界很复杂时,算法会失效。
不过可以通过核变换方法,核k-means 就能够找到簇之间复杂的非线性边界了。
核 k-means 算法在 Scikit-Learn 的 SpectralClustering 评估器中实现,
它使用最近邻图(the graph of nearest neighbors)来计算数据的高维表示,然后用 k-means 算法分配标签
from sklearn.datasets import make_moons
X, y = make_moons(200, noise=.05, random_state=0)
labels = KMeans(2, random_state=0).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.show()
当数据量较大时,k-means 会很慢
批处理(batch-based) k-means 算法的核心思想,该算法在 sklearn.cluster.MiniBatchKMeans 中实现。该算法的接口和标准的 KMeans 接口相同。
k-means 聚类算法流程
① 指定需要划分的簇的个数k值(类的个数)
② 随机地选择k个数据对象作为初始的聚类中心(不一定要是我们的样本点
③ 计算其余的各个数据对象到这个k个初始聚类中心的距离,把数据对象划归到距离它最近的那个中心所处的簇类中;
④ 调整新类并且重新计算出新类的中心。
⑤ 循环步骤③和④,看中心是否收敛(不变),如果收敛或达到迭代次数则停止循环;
⑥ 结束