【问题标题】:Kmeans clustering and mean vectorKmeans 聚类和均值向量
【发布时间】:2014-07-23 08:41:52
【问题描述】:

我要将数据聚集到两个集群中,然后计算两个集群的平均向量,但我做不到,原因是平均值不适用于没有规则形状的数组,知道如何我管理我的数据?

import numpy as np
X = np.array([[1,1],[1.5,2],[3,4],[5,7],[3.5,5],[3,7],[3.5,4.5],[5,8],[5,1]])
centroid = np.array([[2.5,2.2],[4,6.3]])
clusters={}
for x in X:

  z= min([(i[0], np.linalg.norm(x-centroid[i[0]]))  for i in enumerate(centroid)], key=lambda t:t[1])

  try:
      clusters[z].append(x)
  except KeyError:
      clusters[z]=[x]

newmu = []
r=[]
d=[]
keys = sorted(clusters.keys())
for k in keys:
  if k[0]==0:
   r.append(clusters[(k[0],k[1])])

  else:
   d.append(clusters[(k[0],k[1])])

c=np.mean(d ,axis = 0)
f=np.mean(r,axis=0)
print c
print f

变量r是:[[array([ 2., 3.])], [array([ 1.5, 2. ])], [array([ 3., 4.])], [array( [ 1。 , 1.])], [array([ 5., 1.])]] 没有问题,因为它确实有规则的形状

问题出在变量 d 中:[[array([ 5., 7.]), array([ 3., 7.])], [array([ 3.5, 5.])], [array( [ 3.5,4.5])], [array([ 5., 8.])]] 它没有规则的形状,所以平均值不起作用

【问题讨论】:

  • 在计算出 d 的平均值后,你到底想要什么?例如:d = [[a,b],[c,d]] => mean([a,b,c,d])[mean([a,c]), mean([c,d])]?
  • 均值 ([array([ 5., 7.]), array([ 3., 7.])], [array([ 3.5, 5. ])], [array([ 3.5,4.5])], [array([ 5., 8.])]]]) = [5+3+3.5+3.5+5\5 ,7+7+5+4.5+8\5] 结果应该是 =[4,6.3]

标签: python arrays k-means mean


【解决方案1】:

你必须在计算平均值之前解包 d:

... 
d = [item for sublist in d for item in sublist]
c = np.mean(np.array(d), axis=0)
... 

【讨论】:

  • 谢谢-它工作了,但我们完全不知道什么时候需要拆包,因为有时两点的距离不一样。例如,如果我们将 [3,7] 更改为 [3,1],则 d 将是这样的: ( ([[array([ 5., 7.])], [array([ 3., 1.] )], [array([ 3.5, 5. ])], [array([ 3.5,4.5])], [array([ 5., 8.])]]) 并且解包结果是 [5,7, 3,1,3.5,5,3.5,4.5,5,8] 和平均值会不同。
  • 不,解包不会产生您所写的内容。总是有一个包含数组列表的列表。
猜你喜欢
  • 2018-08-17
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 2019-12-09
  • 2018-08-22
  • 2013-11-18
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多