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