【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

5.运行结果

在这里插入图片描述

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值