我遇到了删除高度相关组件的问题。我可以问一下如何做到这一点吗?
例如,我有40个具有20个功能的实例(随机创建)。特征2和18与特征4高度相关。特征6与特征10高度相关。那么如何去除高度相关(冗余)的特征,如2,18和10?基本上,我需要剩余要素的索引1,3,4,5,6,...,9,11,...,17,19,20。
Matlab代码:
x = randn(40,20);
x(:,2) = 2.*x(:,4);
x(:,18) = 3.*x(:,4);
x(:,6) = 100.*x(:,10);
x_corr = corr(x);
size(x_corr)
figure, imagesc(x_corr),colorbar
相关矩阵x_corr
看起来像
编辑:
我找到了一个方法:
x_corr = x_corr - diag(diag(x_corr));
[x_corrX, x_corrY] = find(x_corr>0.8);
for i = 1:size(x_corrX,1)
xx = find(x_corrY == x_corrX(i));
x_corrX(xx,:) = 0;
x_corrY(xx,:) = 0;
end
x_corrX = unique(x_corrX);
x_corrX = x_corrX(2:end);
im = setxor(x_corrX, (1:20)');
我是对的吗?或者你有一个更好的主意,请发布。感谢。
edit2:此方法与使用PCA相同吗?
答案 0 :(得分:2)
很明显,你的这个想法,只是从分析中删除高度相关的变量与PCA不同。 PCA是一种很好的方法,可以将看似复杂问题的等级降低到最终只发生一些独立事物的方法。 PCA使用特征值(或svd)分解来实现该目标。
无论如何,你可能有问题。例如,假设A与B高度相关,B与C高度相关。但是,A和C高度相关并非如此。由于相关性可被视为对应高维向量空间中这些向量之间角度的度量,因此可以很容易地实现这一点。
作为一个简单的例子,我将创建两个变量A和B,它们在“中等”级别相关。
n = 50;
A = rand(n,1);
B = A + randn(n,1)/2;
corr([A,B])
ans =
1 0.55443
0.55443 1
所以这里0.55是相关性。我将C创建为几乎是A和B的平均值。根据您的定义,它将高度相关。
C = [A + B]/2 + randn(n,1)/100;
corr([A,B,C])
ans =
1 0.55443 0.80119
0.55443 1 0.94168
0.80119 0.94168 1
显然C在这里是坏人。但是,如果只是简单地看一对[A,C]并从分析中删除A,那么对该对[B,C]执行相同操作然后删除B,我们就会做出错误的选择。这是一个简单的例子。
事实上,相关矩阵的特征值确实很有意义。
[V,D] = eig(corr([A,B,C]))
V =
-0.53056 -0.78854 -0.311
-0.57245 0.60391 -0.55462
-0.62515 0.11622 0.7718
D =
2.5422 0 0
0 0.45729 0
0 0 0.00046204
D有两个重要的对角线元素,而一个微小的对角线元素告诉我们,实际上,这是一个双变量问题。 PCA不会轻易告诉我们的是简单地删除哪个向量,并且只有更多变量才能解决问题,并且所有变量之间都有很多相互作用。
答案 1 :(得分:2)
我认为木片的答案非常好。但是当你使用特征值时,你可能会遇到麻烦。如果数据集足够大,总会有一些小的特征值,但你不确定它们告诉你什么。
相反,请考虑通过简单的群集方法对数据进行分组。它很容易在Matlab中实现。
http://www.mathworks.de/de/help/stats/cluster-analysis-1-1.html
编辑:
如果你忽视木片制造的那些点,那么你的解决方案是可行的,作为一种算法。