我有一个相关矩阵,它是通过Matlab的corrcoef()使用Pearson线性相关系数获得的。尺寸为100x100的相关矩阵,即我针对100个随机变量计算了相关矩阵。
在这100个随机变量中,我想找到10个随机变量,它们的相关矩阵包含尽可能少的“相关性”(请参阅量化相关矩阵A与相关矩阵B相比要测量的指标多少)相关矩阵中的整体相关性)。我只关心成对相关。
是否有好的方法可以在合理的时间内找到这10个随机变量(例如,我不想尝试组合)?近似算法是可以的。
我有一个相关矩阵,它是通过Matlab的corrcoef()使用Pearson线性相关系数获得的。尺寸为100x100的相关矩阵,即我针对100个随机变量计算了相关矩阵。
在这100个随机变量中,我想找到10个随机变量,它们的相关矩阵包含尽可能少的“相关性”(请参阅量化相关矩阵A与相关矩阵B相比要测量的指标多少)相关矩阵中的整体相关性)。我只关心成对相关。
是否有好的方法可以在合理的时间内找到这10个随机变量(例如,我不想尝试组合)?近似算法是可以的。
Answers:
让我们考虑绝对成对相关性之和作为我们的选择量度。因此,我们寻求一个向量其中将使最小,其中。
假设Q也是A的正定,该问题被简化为解决约束二次优化问题:
这表明下面的放松:
可以使用现成的求解器轻松解决;然后由最大的分量给出结果。
示例Matlab代码:
N=100;
n=10;
% Generate random data
A=rand(N,1000);
C=corrcoef(A');
Q=abs((C+C')/2); % make sure it is symmetric
x = cplexqp(Q,zeros(1,N),[],[], ones(1, N),n, zeros(N,1), ones(N,1));
% If you don't use CPLEX, use matlab's default
% x = quadprog(Q,zeros(1,N),[],[], ones(1, N),n, zeros(N,1), ones(N,1));
assert(abs(sum(x)-n)<1e-10);
% Find the n largest values
I=sort(x);
v=zeros(size(x)); v(x>I(N-n))=1;
assert(abs(sum(v)-n)<1e-10);
% Make sure we do better than 10K random trials
for i=1:10000
vc=zeros(size(x)); vc(randperm(N,n))=1;
assert(sum(vc)==n, 'Wrong l0 norm');
assert(vc'*Q*vc>v'*Q*v, 'Improves result');
end
% Show results
J=find(v==1);
fprintf('The optimal solution total off-diagonal correlations are %1.3f\n', v'*Q*v-n);
fprintf('The matrix:\n');
C(J,J)
这可能比@ttnphns的分层聚类思想更糟。但是:我碰巧遇到了使用作为增加的亚模目标函数的论文:
Vanchinathan,Marfurt,Robelin,Kossman和Krause。从海量数据中发现有价值的物品。KDD2015。(doi,arXiv)
如果您认为这是“最小相关”的合理度量,则可以通过简单地迭代选择最大化该点的点来获得最佳集合的因子。这可以通过块LU分解有效地完成,其中是矩阵中已有条目的相关向量:
当然,您应该计算,其中是的Cholesky因式分解并使用三角求解器这是。因此,假设已经计算了相关矩阵,则整个过程应花费时间从元素中选取个。。
查找成对相关性最低的项中的:由于说的相关性解释了两个序列之间的关系的,因此将目标 项目的相关性平方和最小化是更有意义的。这是我的简单解决方案。
将您的 个相关矩阵重写为相关的平方矩阵。对每列的平方求和。消除具有最大和的列和相应的行。您现在有了矩阵。重复直到您有一个 ×矩阵。您也可以仅使列和对应的行的最小。比较这些方法,我发现在一个和的矩阵中,只有两个相近和的项被不同地保留和消除。
metrics to measure the overall correlation
。您在专门考虑行列式吗?