Python中的K-means聚类算法在机器学习中的应用

图片[1]-Python中的K-means聚类算法在机器学习中的应用-山海云端论坛

引言

聚类是将一个数据集按照特定标准划分成多个类或簇的过程,使得同一簇内的数据对象的相似性尽可能大,不同簇之间的差异性尽可能大。聚类算法属于无监督学习算法的一种。

图片[2]-Python中的K-means聚类算法在机器学习中的应用-山海云端论坛

k-均值聚类算法

k-均值聚类算法是最基础的聚类算法之一,通过迭代的方式将数据集划分成k个簇。用户需要指定聚类的类别数目k。

步骤概述:

  1. 选择k,确定聚类的类别数目。
  2. 随机选择k个样本作为不同类别的类内中心点。
  3. 计算每个样本到k个中心点的距离,选择距离最近的中心点的类别作为该样本的类别。
  4. 根据新的样本类别,重新计算每个类别的类内中心点。
  5. 重复步骤3和4,直到样本类别不再发生变化。
  6. 算法结束。

K值选择

图片[3]-Python中的K-means聚类算法在机器学习中的应用-山海云端论坛

确定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>
图片[4]-Python中的K-means聚类算法在机器学习中的应用-山海云端论坛

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>
图片[5]-Python中的K-means聚类算法在机器学习中的应用-山海云端论坛

总结

本文介绍了机器学习中k-means聚类算法的原理及其在数据挖掘中的应用,并提供了完整的代码示例。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容