引言
聚类是将一个数据集按照特定标准划分成多个类或簇的过程,使得同一簇内的数据对象的相似性尽可能大,不同簇之间的差异性尽可能大。聚类算法属于无监督学习算法的一种。
k-均值聚类算法
k-均值聚类算法是最基础的聚类算法之一,通过迭代的方式将数据集划分成k个簇。用户需要指定聚类的类别数目k。
步骤概述:
- 选择k,确定聚类的类别数目。
- 随机选择k个样本作为不同类别的类内中心点。
- 计算每个样本到k个中心点的距离,选择距离最近的中心点的类别作为该样本的类别。
- 根据新的样本类别,重新计算每个类别的类内中心点。
- 重复步骤3和4,直到样本类别不再发生变化。
- 算法结束。
K值选择
确定k值通常使用WCSS(Within-Cluster-Sum-of-Squares)方法。WCSS是簇内节点平方偏差之和,希望聚类后每个样本到其簇内中心点的距离最小。
代码实现
样例数据生成:
<code>from clustering__utils import * x1, y1, x2, y2 = synthData() X1 = np.array([x1, y1]).T X2 = np.array([x2, y2]).T</code>
K-means实现:
<code>class kMeans(Distance): def __init__(self, K=2, iters=16, seed=1): super(kMeans, self).__init__() self._K = K self._iters = iters self._seed = seed self._C = None def _FNC(self, x, c, n): cmp = np.ndarray(n, dtype=int) for i, p in enumerate(x): d = self.distance(p, self._C) cmp[i] = np.argmin(d) return cmp def pred(self, X): n, dim = X.shape np.random.seed(self._seed) sel = np.random.randint(0, n, self._K) self._C = X[sel] cmp = self._FNC(X, self._C, n) for _ in range(self._iters): for i in range(sel.size): P = X[cmp == i] self._C[i] = np.mean(P, axis=0) cmp = self._FNC(X, self._C, n) return cmp, self._C</code>
K值确定
计算不同k值下的WCSS值:
<code>Cs = 12 V1 = np.zeros(Cs) V2 = np.zeros(Cs) D = Distance() for k in range(Cs): kmeans = kMeans(K=k + 1, seed=6) fnc1, C1 = kmeans.pred(X1) fnc2, C2 = kmeans.pred(X2) for i, [c1, c2] in enumerate(zip(C1, C2)): d1 = D.distance(c1, X1[fnc1 == i])**2 d2 = D.distance(c2, X2[fnc2 == i])**2 V1[k] += np.sum(d1) V2[k] += np.sum(d2)</code>
总结
本文介绍了机器学习中k-means聚类算法的原理及其在数据挖掘中的应用,并提供了完整的代码示例。
© 版权声明
THE END
暂无评论内容