我试图创建一个g-means的粗略实现,用递归将一个样本分解成高斯分布的簇,但我的程序似乎只朝一个方向(向下)前进。该方法的输入值为数据集X和中心列表。在
我很难弄清楚如何解决这个方法的递归位(最后一个for循环和以后的循环)。在所有递归调用之后,我希望在C中有一个可以返回到main方法的中心列表。在
下面是最后一个for循环中发生的情况。我正在遍历一个集群列表(使用我的集群中心找到),clust,它包含每个集群中的所有值。我运行一个测试,看看是否有明显的证据表明每个簇中的值是高斯的。如果有证据的话,我想移除这个集群中心,在上面和下面增加两个新的中心。然后我想运行另一个递归调用,然后评估这些新中心,看看它们匹配的簇是否是高斯的。在
问题是我的程序只评估了中心下界。它似乎永远不会到达上中间点,好像返回语句意味着程序将阻止到达上中间点。在
有人知道我怎样才能使我的方法同时覆盖集群的上下侧吗?(for循环通常只进行1次迭代(for i in range(len(clust))),即使clust的长度=2。在
我遇到的另一个问题是,我的方法只是简单地重写centers列表,而不是每次递归调用都添加到它。有人知道我如何在添加列表时进行递归调用吗?我在列表中插入项目,并将列表的一部分传递到更深层次,但是返回时,我只得到两个值(都非常低)。在
def gMean(X,C):
label=vq.kmeans2(X,np.array(C))
#take care of centers that do not match to clusters in kmeans2
while(len(set(range(len(C))))!=len(set((label[1])))):
emptyK=set(range(len(C)))- set(range(len(C))).intersection(set(label[1]))
emptyK=list(emptyK)
emptyK.reverse()
for i in range(len(emptyK)):
C.pop(emptyK[i])
label=vq.kmeans2(X,np.array(C))
#clust is a 2D list and holds all the values for given cluster
clust=[[] for x in range(max(label[1])+1)]
for i in range(len(label[1])):
for j in range(len(clust)):
if j==label[1][i]:
clust[j].append(X[i])
for i in range(len(clust)):
transClust=np.transpose(clust[i])
notGausFlag=False
for j in range(len(transClust)):
if stats.anderson(transClust[j])[1][2]<stats.anderson(transClust[j])[0]:
notGausFlag=True
if notGausFlag==True:
upper,lower=findCenter(clust[i],C[i])
C.pop(i)
C.insert(i,upper)
C.insert(i,lower)
for j in range(len(clust[i])):
clust[i][j]=clust[i][j].tolist()
clust[i]=np.array(clust[i])
return gMean(clust[i],C[i:i+2])
if notGausFlag==False:
return C
所以我想我意识到了代码中的错误,我调用了一个递归方法并传递了一个带有两个群集中心的集群,但是当我进入下一级递归循环时,我只会使用第一个中心,因为在for循环中没有到达第二个中心(fori in range(len(close)):)。在
我应该这样调用递归方法。在
返回gMean(clust[i],C[i])+gMean(clust[i],C[i+1])
相关问题 更多 >
编程相关推荐