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