找到具有最小成对相关性的 n 个项目中的 k 个

机器算法验证 相关性 排行
2022-03-09 16:24:28

我有一个 n 项之间的成对相关矩阵。现在我想找到相关性最小的 k 个项目的子集。因此有两个问题:

  1. 哪个是该组内相关性的适当度量?
  2. 如何找到相关性最小的组?

这个问题对我来说似乎是一种逆因子分析,我很确定有一个直接的解决方案。

我认为这个问题实际上等于从完整图中删除(nk)节点的问题,以便剩余节点以最小边权重连接。你怎么看?

提前感谢您的建议!

3个回答

[预警:这个答案出现在 OP 决定重新制定问题之前,因此它可能已经失去了相关性。最初的问题是关于How to rank items according to their pairwise correlations]

因为成对相关矩阵不是一维数组,所以不太清楚“排名”可能是什么样子。特别是只要你还没有像看起来那样详细地制定出你的想法。但是您提到 PCA 适合您,这立即让我认为Cholesky 根可能是更合适的替代方案。

Cholesky 根就像 PCA 留下的载荷矩阵,只是它是三角形的。我将用一个例子来解释这两者。

R, correlation matrix
         V1       V2       V3       V4
V1   1.0000   -.5255   -.1487   -.2790
V2   -.5255   1.0000    .2134    .2624
V3   -.1487    .2134   1.0000    .1254
V4   -.2790    .2624    .1254   1.0000

A, PCA full loading matrix
          I       II      III       IV
V1   -.7933    .2385    .2944    .4767
V2    .8071   -.0971   -.3198    .4867
V3    .4413    .8918    .0721   -.0683
V4    .5916   -.2130    .7771    .0261

B, Cholesky root matrix
          I       II      III       IV
V1   1.0000    .0000    .0000    .0000
V2   -.5255    .8508    .0000    .0000
V3   -.1487    .1589    .9760    .0000
V4   -.2790    .1361    .0638    .9485

A*A' or B*B': both restore R
         V1       V2       V3       V4
V1   1.0000   -.5255   -.1487   -.2790
V2   -.5255   1.0000    .2134    .2624
V3   -.1487    .2134   1.0000    .1254
V4   -.2790    .2624    .1254   1.0000

PCA 的加载矩阵 A 是变量和主成分之间的相关矩阵。我们可以这样说,因为行平方和都是 1(R 的对角线),而矩阵平方和是整体方差(R 的迹)。B 的 Cholesky 根元素也是相关的,因为该矩阵也具有这两个属性。B 的列不是 A 的主要组件,尽管它们在某种意义上是“组件”。

A 和 B 都可以恢复 R,因此都可以替换 R,作为它的表示。B 是三角形的,这清楚地表明它按顺序或分层捕获 R 的成对相关性。Cholesky 分量I与所有变量相关,是第一个变量的线性图像V1组件II不再与最后三个共享V1但与最后三个IV相关......最后仅与最后一个相关,V4. 我认为这种“排名”也许是您所寻求的

但是,Cholesky 分解的问题在于 - 与 PCA 不同 - 它取决于矩阵 R 中项目的顺序。好吧,您可以对项目进行排序是平方元素之和的降序或升序(或者,如果你喜欢,绝对元素的总和,或按多重相关系数的顺序 - 请参见下文)。此顺序反映了项目的总体相关程度。

R, rearranged
         V2       V1       V4       V3 
V2   1.0000   -.5255    .2624    .2134 
V1   -.5255   1.0000   -.2790   -.1487 
V4    .2624   -.2790   1.0000    .1254 
V3    .2134   -.1487    .1254   1.0000 

Column sum of squares (descending)
     1.3906   1.3761   1.1624   1.0833 

B 
          I       II      III       IV 
V2   1.0000    .0000    .0000    .0000 
V1   -.5255    .8508    .0000    .0000 
V4    .2624   -.1658    .9506    .0000 
V3    .2134   -.0430    .0655    .9738

从最后一个 B 矩阵我们看到V2,最严重相关的项目,将其所有相关性典当在 中I下一个严重相关的项目V1典当其所有相关性,除了与V2, in II; 等等。


另一个决定可能是计算每个项目的多重相关系数并根据其大小进行排名。一个项目与所有其他项目之间的多重相关性随着项目与所有其他项目的相关性增加而增长,但它们彼此之间的相关性较低。平方多重相关系数形成所谓的图像协方差矩阵的对角线,即,其中的对角线的倒数的对角矩阵SR1S2S+RSR1

这是我对问题的解决方案。我计算了 n 个项目中 k 个的所有可能组合,并通过将问题转换为图论问题来计算它们的相互依赖关系:哪个是包含所有 k 个节点且边和(依赖关系)最小的完整图?这是一个使用 networkx 库的 python 脚本和一个可能的输出。请为我的问题中的任何歧义道歉!

代码:

import networkx as nx
import itertools
import os

#Create new graph
G=nx.Graph()

#Each node represents a dimension
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10,11])

#For each dimension add edges and correlations as weights
G.add_weighted_edges_from([(3,1,0.563),(3,2,0.25)])
G.add_weighted_edges_from([(4,1,0.688),(4,3,0.438)])
G.add_weighted_edges_from([(5,1,0.25),(5,2,0.063),(5,3,0.063),(5,4,0.063)])
G.add_weighted_edges_from([(6,1,0.063),(6,2,0.25),(6,3,0.063),(6,4,0.063),(6,5,0.063)])
G.add_weighted_edges_from([(7,2,0.25),(7,3,0.063),(7,5,0.125),(7,6,0.063)])
G.add_weighted_edges_from([(8,1,0.125),(8,2,0.125),(8,3,0.5625),(8,5,0.25),(8,6,0.188),(8,7,0.125)])
G.add_weighted_edges_from([(9,1,0.063),(9,2,0.063),(9,3,0.25),(9,6,0.438),(9,7,0.063),(9,8,0.063)])
G.add_weighted_edges_from([(10,1,0.25),(10,2,0.25),(10,3,0.563),(10,4,0.125),(10,5,0.125),(10,6,0.125),(10,7,0.125),(10,8,0.375),(10,9,0.125)])
G.add_weighted_edges_from([(11,1,0.125),(11,2,0.063),(11,3,0.438),(11,5,0.063),(11,6,0.1875),(11,7,0.125),(11,8,0.563),(11,9,0.125),(11,9,0.188)])

nodes = set(G.nodes())
combs = set(itertools.combinations(nodes,6))
sumList = []
for comb in combs:
    S=G.subgraph(list(comb))
    sum=0
    for edge in S.edges(data=True):
        sum+=edge[2]['weight']
    sumList.append((sum,comb))

sorted = sorted(sumList, key=lambda tup: tup[0])    

fo = open("dependency_ranking.txt","wb")

for i in range(0,len(sorted)):
    totalWeight = sorted[i][0]
    nodes = list(sorted[i][1])
    nodes.sort()
    out = str(i)+": "+str(totalWeight)+","+str(nodes)
    fo.write(out.encode())
    fo.write("\n".encode())

fo.close()

S=G.subgraph([1,2,3,4,6,7])
sum = 0
for edge in S.edges(data=True):
        sum+=edge[2]['weight']
print(sum)

样本输出:

0: 1.0659999999999998,[2, 4, 5, 7, 9, 11]
1: 1.127,[4, 5, 7, 9, 10, 11]
2: 1.128,[2, 4, 5, 9, 10, 11]
3: 1.19,[2, 4, 5, 7, 8, 9]
4: 1.2525,[4, 5, 6, 7, 10, 11]
5: 1.377,[2, 4, 5, 7, 9, 10]
6: 1.377,[2, 4, 7, 9, 10, 11]
7: 1.377,[2, 4, 5, 7, 10, 11]

输入图: 在此处输入图像描述

解图: 在此处输入图像描述

对于一个玩具示例,k=4,n=6: 输入图: 在此处输入图像描述

解图: 在此处输入图像描述

最好的,

基督教

找到具有最小成对相关性个:由于的相关性解释个项目的相关性平方和更有意义这是我的简单解决方案。kn0.60.36k

相关矩阵重写为相关平方矩阵。对每列的平方求和。消除总和最大的列和相应的行。你现在有一个矩阵。重复直到你有一个矩阵。个最小总和的列和相应的行。比较这些方法,我发现在一个的矩阵中,只有两个总和接近的项目被不同地保留和消除。n×n(n1)×(n1)k×kkn=43k=20