我是数据分析的新手,并试图更好地理解在进行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

最佳答案

通常不考虑变量离群值,而是数据点。这个想法是,给定变量中的数据来自特定的分布,但有时由于某些特定原因,该值与该分布有很大的出入。在检测并消除这些异常值之后,可以更好地满足通过分析程序做出的分布假设。另一方面,通常不将变量视为来自(变量的)分布。因此,将变量视为离群值是没有意义的。

您所遇到的情况是您的四个变量高度相关,而第五个变量与其余变量几乎不相关:

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%以上。

您认为使“社会科学”与众不同的是对“主要组成部分”的图:

但是,这些轴标签实际上是错误的。您在这里绘制的是协方差矩阵的前两个特征 vector 的系数:
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])。这就是为什么“社会科学”在您的情节中有其独立的位置的原因-但这并不意味着存在“异常值”。

逐列读取这些系数(一次读取一个特征 vector )可以告诉您,第一个主成分可以作为变量1到4([-0.5 -0.5 -0.5 -0.5 0])的平均值的两倍的负数获得,而第二个主成分可以通过简单地获取第5个变量( [0 0 0 0 1])。对于给定的主成分,这些数字也称为原始变量的“加载”。如果要从PC重构原始变量,则相同的数字告诉您各个主成分如何对原始变量起作用。在这种解释中,本征 vector 可以被称为与“主要成分”相对应的“主要模式”。

主成分或主变量是使用特征 vector 系数(或“负荷”)转换为新变量集的原始变量集:
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')

与原始变量相反,主成分互不相关,如果特征 vector 矩阵按特征值降序排序,则所得PC按方差的降序排序。给定数据点的主要成分的值也称为成分“得分”。

同样,第一台PC实际上与变量1到4的通用变化相同,而第二台PC实际上与变量5相同,如果您简单地绘制原始数据,这也很明显:
plot(data, '.-')
legend(colNames)

关于matlab - 执行PCA时检测异常值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25515734/

10-13 03:07