python - 证明 K-Means 算法将更新一个聚类 C,使得一个聚类变为空,即使它在 C 中至少有一个点?
问题描述
这是 K-means 算法,它接收具有 k 个簇和终止标准 eps 的 2D-numpy 数组 D。我需要展示一个示例,其中更新的集群变为空,但在我尝试过的每个示例中都没有发生这种情况。我无法创建集群并开始迭代,我必须从均值和 k 开始。
我试图改变 k 的值,改变手段的值。但到目前为止没有任何效果。
这是我在 python 中实现的代码(mu 是手段,或上图中调用的质心):
def kMeans(D, k, eps, mu = None):
t = 0
if mu == None:
mu = []
for a in range(k):
mu.append(np.random.randint(np.min(D), np.max(D), size = (1,2))[0].tolist())
MuD = eps + 0.1
while (MuD > eps):
MuAnterior = mu.copy()
C = []
t += 1
clusters = [[] for _ in range(k)]
for c in range(len(D)):
dist = [[] for _ in range(k)]
for d in range(k):
dist[d].append(pow(distance.euclidean(D[c], mu[d]),2))
clusters[np.argmin(dist)].append(D[c])
C.append(np.argmin(dist))
for e in range(k):
suma = 0
for f in range(len(clusters[e])):
suma += clusters[e][f]
if len(clusters[e]) != 0:
mu[e] = (suma/len(clusters[e])).tolist()
else:
mu[e] = [0, 0]
MuD = 0
for a in range(k):
MuD += pow(distance.euclidean(mu[a], MuAnterior[a]),2)
return C, mu
解决方案
在一维空间中,初始聚类为 [0]、[1, 5]、[6],第一步将更新为 [0, 1]、[]、[5, 6]。
推荐阅读
- java - 不断收到 java.sql.SQLException:没有合适的驱动程序,错误,但我的连接器在正确的文件夹中
- c# - 为什么 ASP.Net Web 窗体控件必须调用其自己的 DataBind 来获取其父标记中定义的绑定?
- azure - AWX docker:如何使用 Active Directory 向 Azure 进行身份验证。对我不起作用
- javascript - 是否可以使用比 ' 和 " 更多的引号?
- c# - 错误:XX 处的 0x1:调用目标已引发异常
- sql - 如何从表中获取每个类别的顶级名称?PostgreSQL
- php - Nginx:无法打开网站上的任何链接。仅首页显示
- android - 如何使用 Android Studio/Kotlin 访问 FirebaseFirestore 中的数组字段?
- c# - 将 ViewState 保存在自定义控件的嵌套下拉列表中
- c# - 如何将路径与 WebRootPath 结合起来