矩阵情形的加权相关性

时间:2014-02-17 15:47:28

标签: matlab matrix statistics covariance correlation

我有问题如何计算矩阵的加权相关性,维基百科我创建了以下三个代码

1.加权平均值计算

function [y]= weighted_mean(x,w);
n=length(x);
%assume that weight vector and input vector have same length
sum=0.0;
sum_weight=0.0;
 for i=1:n
    sum=sum+ x(i)*w(i);
    sum_weight=sum_weight+w(i);
 end
y=sum/sum_weight;
end

2.加权协方差

function result=cov_weighted(x,y,w)
n=length(x);
sum_covar=0.0;
sum_weight=0;
 for i=1:n
     sum_covar=sum_covar+w(i)*(x(i)-weighted_mean(x,w))*(y(i)-weighted_mean(y,w));
     sum_weight=sum_weight+w(i);
 end
 result=sum_covar/sum_weight;
end

最后加权相关

3

function corr_weight=weighted_correlation(x,y,w);
corr_weight=cov_weighted(x,y,w)/sqrt(cov_weighted(x,x,w)*cov_weighted(y,y,w));
end

现在我想对矩阵应用与此链接相关的加权相关方法

http://www.mathworks.com/matlabcentral/fileexchange/20846-weighted-correlation-matrix/content/weightedcorrs.m

我什么都不懂,怎么申请,为什么我创造了我自己,但是在输入的情况下需要矩阵,非常感谢

1 个答案:

答案 0 :(得分:1)

@ dato-datuashvili也许我提供了太多的信息.​​.....

1)我想强调加权相关矩阵的评估非常罕见。发生这种情况是因为您必须事先提供权重。除非你有明确的理由选择权重,否则没有明确的方法来提供它们。

您如何判断样品的测量值是否比另一个测量值更重要或更重要?

话虽如此,权重取决于你!哟必须选择它们!

因此,人们通常只考虑相关矩阵(没有权重或所有权重都相同,例如w_i = 1)。

如果您有明确的方法来选择好的重量,请不要考虑这部分。

2)我知道你想测试你的代码。所以,为此,你必须有相关的随机变量。如何生成它们?

多变量正态分布是最简单的情况。请参阅维基百科页面:Multivariate Normal Distribution(请参阅“从分布中绘制值”项目。维基百科向您展示如何使用Choleski分解从此分布生成随机数)。 2变量的情况要简单得多。例如,请参阅Generate Correlated Normal Random Variables

好消息是,如果你使用Matlab,那么有一个功能。请参阅Matlab: Random numbers from the multivariate normal distribution。]

要使用此功能,您必须提供所需的方法和协方差。 [请注意,你在这里扮演大自然的角色。你正在生成数据!在现实生活中,您将把您的功能应用于真实数据。我想说的是这一步只对测试有用。此外,请注意以下事实:在Matlab函数中,您提供方差并评估相关性(由标准误差标准化的协方差)。在二维情况下(就是您的函数的情况,可以直接提供相关性。请参阅我向您提供的Math.Stackexchange上面的页面]

3)最后,您可以将它们应用于您的功能。从正常的多元分布生成X和Y,并为函数corr_weight_correlation提供权重w的向量,你就完成了!

我希望我能提供你所需要的东西!

丹尼尔

更新

% From the matlab page
mu = [2 3];
SIGMA = [1 1.5; 1.5 3];
n=100;
[x,y] = mvnrnd(mu,SIGMA,n);
% Using your code
w=ones(n,1);
corr_weight=weighted_correlation(x,y,w); % Remember that Sigma is covariance and Corr_weight is correlation. In order to calculate the same thing, just use result=cov_weighted instead.