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