【问题标题】:Python recursive call for list elementsPython递归调用列表元素
【发布时间】:2015-06-19 21:42:44
【问题描述】:

我尝试创建 g-means 的粗略实现,以使用递归将样本分解为高斯集群,但我的程序似乎只朝着一个方向(向下)前进。该方法的输入值是一个数据集 X 和一个中心列表。

我无法弄清楚如何解决此方法的递归位(最后一个 for 循环及以后)。在所有的递归调用之后,我想要一个可以返回给 main 方法的 C 中的中心列表。

这就是最后一个 for 循环中发生的情况。我正在遍历包含每个集群中所有值的集群列表(使用我的集群中心找到)集群。我运行了一个测试,看看是否有重要的证据表明每个集群中的值都是高斯的。如果有证据,那么我想删除那个集群中心并在上面和下面添加两个新的中心。然后我想运行另一个递归调用,然后评估这些新中心,看看它们匹配的集群是否是高斯的。

问题是我的程序只评估下中心界限。似乎永远不会到达上中心,就好像 return 语句意味着程序将永远无法到达上中心。

有谁知道我怎样才能让我的方法同时覆盖集群的下侧和上侧? (for 循环通常只进行 1 次迭代(for i in range(len(clu​​st))),即使集群的长度 = 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

【问题讨论】:

  • 您在某处使用的数据是否可用?
  • 是的,对不起,我不确定它是否有助于显示整个文件或只是递归调用(出现问题的地方)。我使用了 iris 数据集。从 sklearn 导入数据集 iris = datasets.load_iris() X=iris.data

标签: python list recursion append


【解决方案1】:

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

我应该做的是像这样调用递归方法。

返回 gMean(clu​​st[i],C[i])+gMean(clu​​st[i],C[i+1])

【讨论】:

    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2011-09-17
    相关资源
    最近更新 更多