【Matlab】降维方法_核主成分分析KPCA
1.基本思想
KPCA(Kernel Principal Component Analysis)是主成分分析(PCA)的一种扩展,它使用核技巧将非线性问题转换为线性问题。其主要思想是通过将数据投影到一个高维的特征空间,使得在该空间中进行的线性处理对应于在原始空间中进行的非线性处理。在该特征空间中,PCA可以应用于原始数据,从而在非线性问题中提供一种有效的降维方法。
具体来说,KPCA的主要步骤包括:首先,使用某种核函数(例如高斯核)计算每对数据点之间的相似性度量,并将其保存在一个核矩阵中。然后,对核矩阵进行中心化,得到中心化核矩阵。接着,通过计算中心化核矩阵的特征向量和特征值,可以在高维特征空间中找到主成分,并将其映射回原始空间中,得到降维后的数据。
通过KPCA,可以捕捉到原始数据中的非线性结构,从而提高模型的准确性。KPCA被广泛应用于许多领域,例如图像处理、模式识别和生物信息学等。
2.数据集介绍
鸢尾花(Iris)数据集是一个经典的数据集,用于机器学习和统计学习中的分类和聚类问题。该数据集包含了三种不同类型的鸢尾花(山鸢尾、变色鸢尾和维吉尼亚鸢尾)的测量数据,每种花各有50个样本。每个样本包含四个特征,即萼片长度、萼片宽度、花瓣长度和花瓣宽度,以及它所属的鸢尾花类型。
该数据集最早由英国统计学家和生物学家Ronald Fisher在1936年的一篇论文中介绍,并一直被广泛用于分类和聚类问题的研究中。由于其简单性和广泛应用性,鸢尾花数据集已成为了机器学习和统计学习中的标准数据集之一。在实践中,该数据集也常被用于学习数据可视化和降维方法,例如PCA和KPCA等。
本文采用的数据是.xlsx格式,前四列为样本的特征值,最后一列为样本的标签,标签值为1,2,3
3.文件结构
iris.xlsx % 鸢尾花数据集,具体格式参考第2部分
kernel_matrix.m % 计算核矩阵
Main.m % 主函数
4.详细代码及注释
4.1 Main.m
% 清空变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
% 加载数据
data = readmatrix('iris.xlsx');
% 将数据按行归一化
data_norm = zscore(data(:,1:end-1));
% 计算核矩阵
K = kernel_matrix(data_norm, 'gaussian', struct('sigma', 1));
% 中心化核矩阵
n = size(K,1);
one_mat = ones(n,n)/n;
K_centered = K - one_mat*K - K*one_mat + one_mat*K*one_mat;
% 计算特征值和特征向量
[V, D] = eig(K_centered);
[D_sorted, idx] = sort(diag(D),'descend');
V_sorted = V(:,idx);
% 选择前k个特征向量
k = 2; % 降到2维
alpha = V_sorted(:,1:k);
% 计算降维后的数据点
data_kpca = K_centered * alpha;
% 绘制降维结果
gscatter(data_kpca(:,1), data_kpca(:,2), data(:,end));
xlabel('Component 1');
ylabel('Component 2');
title('KPCA of Iris Dataset');
4.1 kernel_matrix.m
function K = kernel_matrix(X, kernel_type, kernel_param)
% 计算核矩阵
%
% 参数:
% X: 输入数据矩阵,每行代表一个样本
% kernel_type: 核函数类型,包括 'linear'、'polynomial' 和 'gaussian'
% kernel_param: 核函数参数,取决于核函数类型
%
% 返回值:
% K: 核矩阵
n = size(X,1);
K = zeros(n);
switch kernel_type
case 'linear'
K = X*X';
case 'polynomial'
d = kernel_param.degree;
c = kernel_param.constant;
K = (X*X' + c).^d;
case 'gaussian'
sigma = kernel_param.sigma;
for i = 1:n
for j = 1:n
K(i,j) = exp(-norm(X(i,:)-X(j,:))^2/(2*sigma^2));
end
end
end
end