三、PCA的操作过程
1、PCA的操作流程大致如下:
- 去平均值,即每一位特征减去各自的平均值
- 计算协方差矩阵
- 计算协方差矩阵的特征值与特征向量
- 对特征值从大到小排序
- 保留最大的个特征向量
- 将数据转换到个特征向量构建的新空间中
2、具体的例子
假设二维数据为:
- 取平均值
我们计算每一维特征的平均值,并去除平均值,我们计算出均值为
去除均值后的矩阵为
- 计算协方差矩阵
- 计算特征值与特征向量
其中,特征值为
特征向量为
- 对特征值进行排序,显然就两个特征值
- 选择最大的那个特征值对应的特征向量
- 转换到新的空间
我们队一个数据集进行了测试:
MATLAB实验代码如下:
主程序
%% pca
dataSet = load('testSet.txt');%导入数据
% pca
[FinalData, reconData] = PCA(dataSet, 1);
%% 作图
hold on
plot(dataSet(:,1), dataSet(:,2), '.');
plot(reconData(:,1), reconData(:,2), '.r');
hold off
PCA函数段
function [ FinalData,reconData ] = PCA( dataSet, k )
[m,n] = size(dataSet);
%% 去除平均值
%取平均值
dataSetMean = mean(dataSet);
%减去平均值
dataSetAdjust = zeros(m,n);
for i = 1 : m
dataSetAdjust(i , :) = dataSet(i , :) - dataSetMean;
end
%% 计算协方差矩阵
dataCov = cov(dataSetAdjust);
%% 计算协方差矩阵的特征值与特征向量
[V, D] = eig(dataCov);
% 将特征值矩阵转换成向量
d = zeros(1, n);
for i = 1:n
d(1,i) = D(i,i);
end
%% 对特征值排序
[maxD, index] = sort(d);
%% 选取前k个最大的特征值
% maxD_k = maxD(1, (n-k+1):n);
index_k = index(1, (n-k+1):n);
% 对应的特征向量
V_k = zeros(n,k);
for i = 1:k
V_k(:,i) = V(:,index_k(1,i));
end
%% 转换到新的空间
FinalData = dataSetAdjust*V_k;
% 在原图中找到这些点
reconData = FinalData * V_k';
for i = 1 : m
reconData(i , :) = reconData(i , :) + dataSetMean;
end
end
参考文献
- 机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
对于本文有任何问题,欢迎邮件或者微博私信,具体联系方式见博客左侧。