在进行PCA时检测异常值

时间:2014-08-26 21:50:14

标签: matlab statistics pca outliers

我是数据分析的新手,并试图更好地了解在进行PCA分析时如何识别异常值。我创建了一个包含5列的数据矩阵来表示我的数学,英语,历史,物理和社会科学的变量;每行代表学生在课堂上收到的最终成绩。当我绘制第一和第二主成分的分数时,我的数据矩阵中的第五列是异常值。我想有一种方法来数学检测异常值,而不必绘制得分;任何建议或想法,以帮助我做到这一点非常感谢。在此先感谢您的帮助。我在下面发布了我的代码。

%Column names
colNames = {'Math','English','History','Physics','Social Science'};

%data matrix
data = [75.23,74.65,77,73.04,72.11;
    88.50,89.43,86.23,88.50,50.97;
    66.12,65.12,67.45,66.02,66.54;
    89.23,90.43,88.21,88.23,71.21;
    72.35,72.43,73.56,74.32,63.51;
    50.23,52.34,51.78,52.32,59.85;
    58.79,58.79,58.79,58.79,91.08;
    86.08,86.08,86.08,86.08,71.49;
    73.67,73.67,73.67,73.67,94.38;
    56.34,57.63,58.23,58.32,69.55;
    67.05,69.42,66.32,65.32,88.45;
    81.23,80.36,80.32,79.89,69.83;
    59.68,59.58,60.32,59.02,90.42;
    87.34,86.92,85.23,86.01,87.75;
    63.21,62.14,62.03,62.32,68.86;
    95.87,94.54,95.65,96.12,60.80;
    64.34,63.45,63.45,63.45,89.52;
    89.32,87.54,88.27,88.01,97.46;
    59.65,58.23,60.32,59.43,66.37;
    63.98,64.37,65.01,64.01,83.56;
    56.34,55.35,53.98,54.25,71.93;
    79.98,78.81,78.01,77.99,91.67;
    84.16,85.021,83.99,84.87,88.44;
    78.38,77.32,76.98,77.56,58.36;
    71.28,72.98,71.99,71.56,93.09;];

%Computing PCA
covarianceMat=cov(data);
[eigenVectors,eigenValues]=eigs(covarianceMat,5);

%Sorting Eigen values
[eigenValues I] = sort(diag(eigenValues),'descend');

%Computing Variance Percentage of each Eigen value
variancePercentage = (eigenValues ./ sum(eigenValues)) .*100;

figure(2)
plot(eigenVectors(:,1),eigenVectors(:,2),'*');
xlabel('Principal Component 1');ylabel('Principal Component 2')
for Loop = 1:length(colNames)
    text(eigenVectors(Loop,1),eigenVectors(Loop,2),colNames{Loop},'Color','r')
end

1 个答案:

答案 0 :(得分:3)

通常不会考虑变量异常值,而是数据点。这个想法是给定变量中的数据来自特定的分布,但偶尔存在一个值,由于某些特定原因,该值远离该分布。在检测并去除这些异常值之后,可以更好地实现由分析程序做出的分布假设。另一方面,变量通常不被认为来自(变量)分布。因此,将变量视为异常值是没有意义的。


你在这里的情况是你的4个变量是强相关的,但是第5个与其他变量几乎不相关:

corrcoef(data) = 
    1.0000    0.9959    0.9955    0.9957   -0.0296
    0.9959    1.0000    0.9934    0.9951   -0.0283
    0.9955    0.9934    1.0000    0.9962   -0.0392
    0.9957    0.9951    0.9962    1.0000   -0.0593
   -0.0296   -0.0283   -0.0392   -0.0593    1.0000

如果您使用PCA,您会发现您的数据在两个主要成分中几乎没有损失,占总方差的99%以上。

你考虑做什么"社会科学"异常值是你主要成分的情节":

但是,这些轴标签实际上是错误的。你在这里绘制的是协方差矩阵的前两个特征向量的系数:

eigenVectors(:, 1:2) = 
   -0.5091    0.0241
   -0.5013    0.0250
   -0.4885    0.0144
   -0.5000   -0.0038
    0.0300    0.9993

这些数字和结果图告诉你的是,前4个变量主要与第一个主成分相关,并且几乎完全相同(系数约[-0.5 0]),而第5个变量几乎相同与第二主成分相同(系数约为[0 1])。这就是为什么"社会科学"在你的情节中有其独立的位置 - 但这并不意味着有一个"异常值"。

逐列读取这些系数(一次一个特征向量)告诉您第一个主成分可以获得两倍于变量1到4([-0.5 -0.5 -0.5 -0.5 0])的平均值,而第二个主成分可以获得只需取第5个变量([0 0 0 0 1])。这些数字也被称为"加载"给定主成分的原始变量。相同的数字告诉您如果要从PC重建这些主要组件,各个主要组件如何对原始变量做出贡献。在这种解释中,特征向量可以被称为"主要模式"对应于"主要组成部分"。

主成分或主要变量是使用特征向量系数(或"载荷")转换为新变量集的原始变量集:

PCs = data * eigenVectors;

与原始变量一样,主要组件是学生索引的功能:

subplot(2, 1, 1)
plot(PCs(:, 1), '.-')
ylabel('Principal Component 1')
subplot(2, 1, 2)
plot(PCs(:, 2), '.-')
ylabel('Principal Component 2')

与原始变量相比,主成分是相互不相关的,并且如果特征向量矩阵按降序特征值排序,则得到的PC按方差的降序排序。给定数据点的主要组件的值也称为组件"得分"。

同样,第一台PC实际上与变量1到4的常见变化相同,而第二台PC几乎与变量5完全相同,如果您只是绘制原始数据,这也变得很明显:

plot(data, '.-')
legend(colNames)