我试图创建一个粗略的g-means实现来将样本分解成簇,其中簇是高斯使用递归,但我的程序似乎只在一个方向(向下)。此方法的输入值是数据集X和中心列表。
我无法弄清楚如何解决此方法的递归位(最后一个for循环及其后)。在所有递归调用之后,我希望在C中有一个可以返回到main方法的中心列表。
所以这是最后一个for循环中发生的事情。我正在遍历一个群集列表(使用我的群集中心找到),clust,其中包含每个群集中的所有值。我运行测试以查看是否有重要证据表明每个群集中的值都是高斯值。如果有证据,那么我想删除该群集中心并在上方和下方添加两个新中心。然后,我想要通过另一个递归调用,然后评估这些新的中心,看看它们匹配的簇是否是高斯的。
问题是我的程序只评估较低的中心界限。它似乎永远不会到达上部中心,好像返回声明意味着程序将阻止上部中心的到达。
有谁知道如何让我的方法覆盖群集的低端和高端? (for循环通常只进行1次迭代(对于范围内的i(len(clust))),即使clust的长度为2。
我遇到的另一个问题是我的方法只是覆盖中心列表而不是每次递归调用都添加它。有人知道如何在追加到列表时进行递归调用吗?我正在将项目插入列表并将列表的一部分传递到更深层次,但在返回时,我只获得两个值(两者都非常低)。
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
答案 0 :(得分:0)
所以我认为我意识到我的代码中的错误我正在调用一个递归方法并传递一个带有两个集群中心的集群,但是当我进入下一级递归循环时,我只会步因为第二个中心在for循环中没有到达(对于i在范围内(len(closet)):)。
我应该做的就是像这样调用递归方法。
返回gMean(clust [i],C [i])+ gMean(clust [i],C [i + 1])