使用pca进行坐标系转换、降维

利用PCA进行坐标系转换

pca是一种常用的数据降维的方法,而其中的降维的步骤就是:

  • 选取前 k 个特征值。

如果我们不选择这个步骤,那么就不会进行降维了,反而会进行坐标系的转换。

具体步骤

1、首先生成高斯二维分布的数据

matlab代码

mul = [1 2];
SIGMA = [1 0.81; 0.81 1];
data1 = mvnrnd(mul,SIGMA,500);
plot(data1(:,1),data1(:,2),'*');
axis equal

alt

2. 使用PCA进行坐标轴的选取

新坐标的优化目的:使得坐标轴正交,并且沿着这些坐标方向的数据的方差最大。

clear;clc;close all;
mul = [1 2];
SIGMA = [1 0.81; 0.81 1];
data1 = mvnrnd(mul,SIGMA,500);
[pc,score,latent] = pca(data1);
figure(1)
axis equal
plot(data1(:,1),data1(:,2),'*');
hold on 
quiver(1,2,pc(1,1),pc(2,1),5)
quiver(1,2,pc(1,2),pc(2,2),5)
plot(sore(:,1),score(:,2))

在这里插入图片描述
这样就可以建立出新的坐标系。

3.m代码主要流程介绍

  1. 生成高斯二维分布的随机数据
  2. pca函数的使用
  3. 在坐标上画向量

PCA进行多维降维以及降维效果的评价

有时候pca降维的时候会损失数据的局部的流形,造成不好的效果。

1、生成数据

先定义一个函数,用来生成一系列有规律的点

%生成一系列园点
function [x1,y1] = creat_circle(r1 , r1_ratio,sita_ratio)
sita = 0:0.05:2*pi;
all_num = size(sita);
all_num = all_num(1,2);
%rand : sita
sita_p = randperm(all_num,floor(sita_ratio*all_num));
%rand : r
r_p = rand(1,floor(sita_ratio*all_num))*r1*r1_ratio;
r1_p = repmat(r1,1,floor(sita_ratio*all_num));
r1_p = r1_p - r_p;
x1 = r1_p.*cos(sita_p);
y1 = r1_p.*sin(sita_p);
scatter(x1,y1)

然后运行下列代码:

% 建立坐标点
clear;clc;close all;
[x1,y1] = creat_circle(3,0.05,0.95);
[x2,y2] = creat_circle(5,0.05,0.95);
[x3,y3] = creat_circle(9,0.05,0.95);
num = size(x1);
z1 = normrnd(5,1,1,num(1,2))+x1;
z2 = wgn(1,num(1,2),1)+4+y2;
z3 = rand(1,num(1,2))+2+x3;
% 画
figure(1)
scatter(x1,y1,'r')
hold on
scatter(x2,y2,'b')
scatter(x3,y3,'g')
figure(2)
scatter3(x1,y1,z1,'r')
hold on
scatter3(x2,y2,z2,'b');
scatter3(x3,y3,z3,'g');

生成好以后,我们可以看看这些点的分布。
在这里插入图片描述换个角度,可以看出规律。我们希望降维后也保存这种规律。
在这里插入图片描述然而实际上,使用PCA进行降维后(降到2维)是这样的:
在这里插入图片描述这样一来降维的效果就不好了。

### PCA 主成分分析实现坐标校正的方法 主成分分析 (Principal Component Analysis, PCA) 是一种常用的技术,能够有效减少数据度并保留重要信息。以下是利用 MATLAB 实现 PCA 进行坐标校正的具体方法。 #### 1. 数据准备与预处理 在进行 PCA 分析之前,需要对原始数据进行必要的清洗和标准化操作。这一步骤对于提高模型性能至关重要[^1]。假设输入数据是一个二矩阵 `X`,每一列代表一个样本点的坐标向量,则可以按照以下方式对其进行预处理: ```matlab % 输入数据 X 的大小为 n×m,n 表示特征数(即坐标轴数量),m 表示样本数 mean_X = mean(X); % 计算均值 std_X = std(X); % 计算标准差 X_normalized = (X - repmat(mean_X, size(X, 1), 1)) ./ repmat(std_X, size(X, 1), 1); ``` 此代码片段实现了对每条记录减去其对应度上的平均值,并除以其对应的方差来完成零中心化以及单位方差变换。 #### 2. 执行 PCA 并提取主成分 调用 MATLAB 自带函数 `[coeff,score,latent] = pca(X)` 可以方便地执行 PCA 操作。这里返回三个变量: - `coeff`: 各个主方向上投影系数构成的载荷矩阵; - `score`: 投影到新空间之后得到的新坐标系下的得分矩阵; - `latent`: 特征根或者解释方差的比例。 具体应用如下所示: ```matlab [coeff, score, latent] = pca(X_normalized); explained_variance_ratio = cumsum(latent)./sum(latent); % 累积贡献率计算 num_components_to_keep = find(explained_variance_ratio >= 0.95, 1); % 至少保持95%的信息量 reduced_data = score(:, 1:num_components_to_keep); % 获取低表示形式 ``` 这段脚本选取累计贡献率达到至少 95% 的那些主分量作为新的表达基础[^2]。 #### 3. 应用逆变换恢复调整后的坐标位置 为了获得经过 PCA 调整过的位置信息,还需要将前面所做的一切变化逆转回去。这样做的好处是可以直观看到哪些地方发生了偏移修正: ```matlab projected_back = reduced_data * coeff(:, 1:num_components_to_keep)'; corrected_coordinates = projected_back .* repmat(std_X, size(projected_back, 1), 1) + repmat(mean_X, size(projected_back, 1), 1); ``` 至此便完成了整个流程——从初始状态出发直至最终得出矫正完毕的结果为止。 #### 注意事项 由于实际应用场景复杂多变,在某些特殊情况下可能还需额外考虑诸如噪声过滤等问题。因此建议使用者依据具体情况灵活调整参数设置[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值