在matlab中实现PCA算法

function [V,S,E]=princa(X)
[m,n]=size(X); %计算矩阵的行m和列n

%-------------第一步:标准化矩阵-----------------%
mv=mean(X); %计算各变量的均值
st=std(X); %计算各变量的标准差
X=(X-repmat(mv,m,1))./repmat(st,m,1); %标准化矩阵X

%-------------第二步:计算相关系数矩阵-----------------%
% R1=X'*X/(m-1); %方法一:协方差矩阵计算公式
% R2=cov(X);     %方法二:协方差矩阵计算函数
R=corrcoef(X); %方法三:相关系数矩阵函数

%-------------第三步:计算特征向量和特征值-----------------%
[V,D]=eig(R);       %计算矩阵R的特征向量矩阵V和特征值矩阵D,特征值由小到大
V=(rot90(V))';      %将特征向量矩阵V从大到小排序
D=rot90(rot90(D));  %将特征值矩阵由大到小排序
E=diag(D);          %将特征值矩阵转换为特征值向量

%-------------第四步:计算贡献率和累计贡献率-----------------%
ratio=0; %累计贡献率
for k=1:n
    r=E(k)/sum(E);   %第k主成份贡献率
    ratio=ratio+r;  %累计贡献率
    if(ratio>=0.9)  %取累计贡献率大于等于90%的主成分
        break;
    end
end

%-------------第五步:计算得分-----------------%
S=X*V;

用matlab实现的pca算法

如果要求主成分分析,用matlab自带一个的函数(princomp)就行。Princomp调用如下:
[COEFF,SCORE,latent,tsquare] = princomp(zscore(X))

zscore(X)是对矩阵X进行标准化操作。
COEFF是X矩阵所对应的协方差阵的所有特征向量组成的矩阵,即变换矩阵或称投影矩阵,每列对应一个特征值的特征向量,列的排列顺序是按特征值的大小递减排序
相当于上面程序中的V,它表示的是主成分的系数。
SCORE是对主成分的打分,也就是说原X矩阵在主成分空间的表示。每行对应样本观测值,每列对应一个主成份(变量),它的行和列的数目和X的行列数目相同。(相当于上面程序中的S)
latent是一个向量,它是X所对应的协方差矩阵的特征值向量。 (相当于程序中的E)
特征值与分数之间的关系:latent=diag(cov(SCORE));
tsquare是表示对每个样本点Hotelling的T方统计量
计算PCA的时候,如果直接有现成的协方差阵,用函数pcacov来计算。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab,可以使用以下步骤实现基于PCA算法的人脸识别: 1. 首先,需要准备一个人脸图像数据集。将每张人脸图像转换为灰度图像,并将其保存为矩阵形式。 2. 对数据矩阵进行心化处理,即将每个像素点的灰度值减去该列像素点灰度值的均值。 3. 计算数据矩阵的协方差矩阵,并对其进行特征值分解。 4. 根据特征值的大小,选择前k个特征向量,构成投影矩阵。这里的k可以根据实际情况进行设定,通常取前80%~90%的特征值。 5. 将每张人脸图像乘以投影矩阵,得到降维后的数据矩阵。 6. 对降维后的数据矩阵进行分类和识别。可以使用KNN(K-Nearest Neighbor)算法或SVM(Support Vector Machine)算法进行分类和识别。 以下是一个简单的Matlab代码示例,演示如何实现基于PCA算法的人脸识别: ```matlab %% Step 1: prepare face image dataset face_data = []; % a matrix to store all face images for i = 1:40 % assume there are 40 people in the dataset, and each person has 10 face images for j = 1:10 % read image and convert to grayscale img = imread(sprintf('person%d_%d.jpg', i, j)); img_gray = rgb2gray(img); % convert to column vector and add to face_data matrix img_col = img_gray(:); face_data = [face_data img_col]; end end %% Step 2: center data matrix mean_face = mean(face_data, 2); % calculate mean face centered_face_data = face_data - mean_face; % center data matrix %% Step 3: calculate covariance matrix and perform eigenvalue decomposition covariance_matrix = centered_face_data' * centered_face_data; % calculate covariance matrix [eig_vectors, eig_values] = eig(covariance_matrix); % perform eigenvalue decomposition %% Step 4: choose top k eigenvectors and form projection matrix eig_values_vec = diag(eig_values); % extract eigenvalues [eig_values_sorted, eig_values_idx] = sort(eig_values_vec, 'descend'); % sort eigenvalues in descending order total_eig_value = sum(eig_values_sorted); % calculate total sum of eigenvalues ratio = 0; k = 0; % initialize ratio and k while ratio < 0.9 % choose top k eigenvectors that capture 90% of variance k = k + 1; ratio = sum(eig_values_sorted(1:k)) / total_eig_value; end proj_matrix = eig_vectors(:, eig_values_idx(1:k)); % form projection matrix %% Step 5: project each face image onto projection matrix proj_face_data = proj_matrix' * centered_face_data; % project face data onto projection matrix %% Step 6: perform classification and recognition (using KNN as an example) labels = repmat([1:40], 10, 1); % create labels for each face image labels = labels(:); % convert to column vector accuracy = 0; % initialize classification accuracy for i = 1:size(face_data, 2) % for each face image test_face = proj_face_data(:, i); % use current face image as test data train_data = proj_face_data(:, [1:i-1 i+1:end]); % use all other face images as training data train_labels = labels([1:i-1 i+1:end]); % corresponding labels predicted_label = knn(train_data', train_labels, test_face', 1); % use KNN algorithm to predict label if predicted_label == labels(i) % if predicted label matches true label accuracy = accuracy + 1; % increment accuracy count end end accuracy = accuracy / size(face_data, 2); % calculate classification accuracy disp(['Classification accuracy: ' num2str(accuracy)]); ``` 上述代码,假设每个人有10张人脸图像,文件名格式为"personX_Y.jpg",其X表示人的编号,Y表示第几张人脸图像。代码使用KNN算法进行分类和识别,使用投影后的数据矩阵作为输入数据。最后输出分类的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值