【Matlab】降维方法_基于稀疏PCA的Sparse Coding降维
1.基本思想
稀疏主成分分析(Sparse PCA)是主成分分析的一种扩展形式,旨在寻找数据中最具有变化性或不规则性的结构。稀疏主成分分析通过将原始数据线性投影到一个高维空间中,寻找最稀疏的主成分来进行数据降维。具体而言,稀疏主成分分析的目标是找到一个稀疏表示,其中只有一小部分主成分系数是非零的,从而压缩数据的维度,同时尽可能地保留原始数据的信息。
在稀疏PCA中,稀疏性通过使用L1正则化实现,即将主成分系数向量的L1范数最小化,同时尽量保持对原始数据的重构误差最小。L1正则化的效果是促使大部分系数为零,只有极少数系数不为零,从而实现数据的稀疏表示。同时,为了使得稀疏主成分能够更好地表示数据的变化性,其目标函数通常包含一个方差项,保证主成分所表示的方差尽量大。
Sparse Coding则是建立在稀疏PCA的基础上的一种降维方法。它通过将数据表示为一个稀疏线性组合的形式,即每个数据点都可以表示为若干个基向量的线性组合,而基向量可以通过稀疏PCA的方法得到。Sparse Coding的基本思想是,寻找一组稀疏基向量,将原始数据点表示为这些基向量的线性组合,从而实现数据的降维。
2.数据集介绍
鸢尾花(Iris)数据集是一个经典的数据集,用于机器学习和统计学习中的分类和聚类问题。该数据集包含了三种不同类型的鸢尾花(山鸢尾、变色鸢尾和维吉尼亚鸢尾)的测量数据,每种花各有50个样本。每个样本包含四个特征,即萼片长度、萼片宽度、花瓣长度和花瓣宽度,以及它所属的鸢尾花类型。
该数据集最早由英国统计学家和生物学家Ronald Fisher在1936年的一篇论文中介绍,并一直被广泛用于分类和聚类问题的研究中。由于其简单性和广泛应用性,鸢尾花数据集已成为了机器学习和统计学习中的标准数据集之一。在实践中,该数据集也常被用于学习数据可视化和降维方法,例如PCA和KPCA等。
本文采用的数据是.xlsx格式,前四列为样本的特征值,最后一列为样本的标签,标签值为1,2,3
3.文件结构
iris.xlsx % 鸢尾花数据集,具体格式参考第2部分
Main.m % 主函数
spca.m % 稀疏PCA函数
4.详细代码及注释
4.1 Main.m
% 清空变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
% 加载数据
data = readmatrix('iris.xlsx');
% 将数据按行归一化
data_norm = zscore(data(:,1:end-1));
% 参数设置
lambda = 1; % 正则化系数
k = 2; % 降到2维
% 稀疏PCA
[alpha, w, err] = spca(data_norm', k, lambda);
% 计算降维后的数据点
data_sc = alpha' * data_norm';
% 绘制降维结果
gscatter(data_sc(1,:), data_sc(2,:), data(:,end));
xlabel('Component 1');
ylabel('Component 2');
title('Sparse Coding of Iris Dataset');
4.2 spca.m
function [alpha, w, err] = spca(X, k, lambda)
% 稀疏PCA
% X: 数据矩阵,每行表示一个样本
% k: 降维后的维数
% lambda: 正则化系数
% 参数设置
max_iter = 100; % 最大迭代次数
tol = 1e-4; % 停止迭代的容差
% 中心化数据
[n, d] = size(X);
X = X - mean(X);
% 初始化权重向量
w = randn(d, k);
% 迭代求解
for iter = 1:max_iter
% 计算每个样本在当前权重下的表示
alpha = X * w;
% 更新权重向量
w_old = w;
for j = 1:k
w(:,j) = X' * (X * w_old(:,j)) / (w_old(:,j)' * X' * X * w_old(:,j) + lambda);
end
% 计算误差
err = norm(X - alpha * w', 'fro');
% 判断是否收敛
if err < tol
break;
end
end
% 计算每个样本在学习到的权重下的表示
alpha = X * w;