Python递归调用list元素

2024-10-04 05:30:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个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

Tags: 方法in列表forlenifnp集群
1条回答
网友
1楼 · 发布于 2024-10-04 05:30:22

所以我想我意识到了代码中的错误,我调用了一个递归方法并传递了一个带有两个群集中心的集群,但是当我进入下一级递归循环时,我只会使用第一个中心,因为在for循环中没有到达第二个中心(fori in range(len(close)):)。在

我应该这样调用递归方法。在

返回gMean(clust[i],C[i])+gMean(clust[i],C[i+1])

相关问题 更多 >