【发布时间】:2015-06-19 21:42:44
【问题描述】:
我尝试创建 g-means 的粗略实现,以使用递归将样本分解为高斯集群,但我的程序似乎只朝着一个方向(向下)前进。该方法的输入值是一个数据集 X 和一个中心列表。
我无法弄清楚如何解决此方法的递归位(最后一个 for 循环及以后)。在所有的递归调用之后,我想要一个可以返回给 main 方法的 C 中的中心列表。
这就是最后一个 for 循环中发生的情况。我正在遍历包含每个集群中所有值的集群列表(使用我的集群中心找到)集群。我运行了一个测试,看看是否有重要的证据表明每个集群中的值都是高斯的。如果有证据,那么我想删除那个集群中心并在上面和下面添加两个新的中心。然后我想运行另一个递归调用,然后评估这些新中心,看看它们匹配的集群是否是高斯的。
问题是我的程序只评估下中心界限。似乎永远不会到达上中心,就好像 return 语句意味着程序将永远无法到达上中心。
有谁知道我怎样才能让我的方法同时覆盖集群的下侧和上侧? (for 循环通常只进行 1 次迭代(for i in range(len(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
【问题讨论】:
-
您在某处使用的数据是否可用?
-
是的,对不起,我不确定它是否有助于显示整个文件或只是递归调用(出现问题的地方)。我使用了 iris 数据集。从 sklearn 导入数据集 iris = datasets.load_iris() X=iris.data
标签: python list recursion append