基于核主成分分析的回归数据降维可视化 matlab代码核主成分分析KPCA这玩意儿真是处理非线性数据降维的神器。今天咱们拿回归任务开刀看看怎么用Matlab把高维回归数据揉成三维可视化的面团。先整点人造数据热热身——搞个带螺旋结构的二维特征加一维响应变量保证降维后能看出点门道。% 生成螺旋结构数据 theta linspace(0, 8*pi, 300); X [theta.*cos(theta)*0.2, theta.*sin(theta)*0.2]; y sin(theta*0.5) randn(300,1)*0.1; % 可视化原始数据 figure; scatter3(X(:,1), X(:,2), y, 40, theta, filled); colorbar; title(原始数据三维分布);!原始数据螺旋结构示意图响应变量在z轴呈现波动这段代码造了个三维螺旋响应变量y沿着螺旋方向做正弦波动。注意scatter3里用theta值着色这个技巧后面可视化降维结果时还能用上。现在数据看着是三维但实际特征空间只有二维不过因为非线性结构传统PCA肯定扑街。上硬菜——核主成分分析实现。咱们用高斯核处理非线性function [X_kpca, lambda] kpca(X, sigma, dim) % 高斯核矩阵计算 sq_dists pdist2(X, X).^2; K exp(-sq_dists/(2*sigma^2)); % 核矩阵中心化 N size(X,1); oneN ones(N,N)/N; K_centered K - oneN*K - K*oneN oneN*K*oneN; % 特征分解 [V,D] eig(K_centered); lambda diag(D); [~, idx] sort(lambda, descend); X_kpca V(:,idx(1:dim)) * sqrt(D(idx(1:dim),idx(1:dim))); end这个函数暗藏玄机pdist2算平方距离比直接算核快得多中心化那步容易漏但没了它核矩阵就不是零均值了特征向量得乘特征值的平方根才是正经投影坐标。调用时sigma选0.5比较合适毕竟咱们生成数据时的尺度是0.2倍螺旋。基于核主成分分析的回归数据降维可视化 matlab代码降维之后别闲着把主成分和响应变量塞给回归模型% 执行KPCA降维 sigma 0.5; X_kpca kpca(X, sigma, 3); % 核岭回归 lambda_reg 0.1; K_reg [X_kpca*X_kpca, ones(size(X_kpca,1),1)]; coeff (K_reg lambda_reg*eye(size(K_reg,1))) \ y; % 预测曲面 [xx,yy] meshgrid(linspace(-1,1,30), linspace(-1,1,30)); X_grid kpca([xx(:), yy(:)], sigma, 3); y_pred [X_grid*X_kpca, ones(size(X_grid,1),1)] * coeff;这里有个骚操作直接用核主成分特征空间做线性回归相当于把非线性映射和线性回归打包处理。注意预测新数据时要重新计算核映射不能直接用原始特征。网格预测那步可能会有点计算量不过30x30的网格还算友好。最后来个全家福可视化% 降维结果可视化 figure; subplot(1,2,1); scatter3(X_kpca(:,1), X_kpca(:,2), X_kpca(:,3), 40, theta, filled); title(KPCA三维嵌入空间); % 回归曲面可视化 subplot(1,2,2); mesh(xx, yy, reshape(y_pred, size(xx))); hold on; scatter3(X_kpca(:,1), X_kpca(:,2), y, 40, r, filled); title(特征空间回归曲面);!左右分屏对比图左侧为KPCA三维嵌入右侧为回归曲面看效果的话左边的三维嵌入应该能清晰呈现螺旋结构展开后的样貌而右边回归曲面要是有个波浪形就说明拟合到位了。实践中要是发现曲面太平滑可能是正则化系数lambda_reg给大了调小点让模型更贴合数据波动。踩坑提示sigma选太小会导致核矩阵对角线太突出降维后数据挤成一团选太大会丢失局部结构。有个经验公式是取样本间距的中位数不过具体还得看数据分布。另外KPCA的计算复杂度是O(N³)数据量上万的话最好用近似算法。
基于核主成分分析的回归数据降维可视化方法及Matlab实现
基于核主成分分析的回归数据降维可视化 matlab代码核主成分分析KPCA这玩意儿真是处理非线性数据降维的神器。今天咱们拿回归任务开刀看看怎么用Matlab把高维回归数据揉成三维可视化的面团。先整点人造数据热热身——搞个带螺旋结构的二维特征加一维响应变量保证降维后能看出点门道。% 生成螺旋结构数据 theta linspace(0, 8*pi, 300); X [theta.*cos(theta)*0.2, theta.*sin(theta)*0.2]; y sin(theta*0.5) randn(300,1)*0.1; % 可视化原始数据 figure; scatter3(X(:,1), X(:,2), y, 40, theta, filled); colorbar; title(原始数据三维分布);!原始数据螺旋结构示意图响应变量在z轴呈现波动这段代码造了个三维螺旋响应变量y沿着螺旋方向做正弦波动。注意scatter3里用theta值着色这个技巧后面可视化降维结果时还能用上。现在数据看着是三维但实际特征空间只有二维不过因为非线性结构传统PCA肯定扑街。上硬菜——核主成分分析实现。咱们用高斯核处理非线性function [X_kpca, lambda] kpca(X, sigma, dim) % 高斯核矩阵计算 sq_dists pdist2(X, X).^2; K exp(-sq_dists/(2*sigma^2)); % 核矩阵中心化 N size(X,1); oneN ones(N,N)/N; K_centered K - oneN*K - K*oneN oneN*K*oneN; % 特征分解 [V,D] eig(K_centered); lambda diag(D); [~, idx] sort(lambda, descend); X_kpca V(:,idx(1:dim)) * sqrt(D(idx(1:dim),idx(1:dim))); end这个函数暗藏玄机pdist2算平方距离比直接算核快得多中心化那步容易漏但没了它核矩阵就不是零均值了特征向量得乘特征值的平方根才是正经投影坐标。调用时sigma选0.5比较合适毕竟咱们生成数据时的尺度是0.2倍螺旋。基于核主成分分析的回归数据降维可视化 matlab代码降维之后别闲着把主成分和响应变量塞给回归模型% 执行KPCA降维 sigma 0.5; X_kpca kpca(X, sigma, 3); % 核岭回归 lambda_reg 0.1; K_reg [X_kpca*X_kpca, ones(size(X_kpca,1),1)]; coeff (K_reg lambda_reg*eye(size(K_reg,1))) \ y; % 预测曲面 [xx,yy] meshgrid(linspace(-1,1,30), linspace(-1,1,30)); X_grid kpca([xx(:), yy(:)], sigma, 3); y_pred [X_grid*X_kpca, ones(size(X_grid,1),1)] * coeff;这里有个骚操作直接用核主成分特征空间做线性回归相当于把非线性映射和线性回归打包处理。注意预测新数据时要重新计算核映射不能直接用原始特征。网格预测那步可能会有点计算量不过30x30的网格还算友好。最后来个全家福可视化% 降维结果可视化 figure; subplot(1,2,1); scatter3(X_kpca(:,1), X_kpca(:,2), X_kpca(:,3), 40, theta, filled); title(KPCA三维嵌入空间); % 回归曲面可视化 subplot(1,2,2); mesh(xx, yy, reshape(y_pred, size(xx))); hold on; scatter3(X_kpca(:,1), X_kpca(:,2), y, 40, r, filled); title(特征空间回归曲面);!左右分屏对比图左侧为KPCA三维嵌入右侧为回归曲面看效果的话左边的三维嵌入应该能清晰呈现螺旋结构展开后的样貌而右边回归曲面要是有个波浪形就说明拟合到位了。实践中要是发现曲面太平滑可能是正则化系数lambda_reg给大了调小点让模型更贴合数据波动。踩坑提示sigma选太小会导致核矩阵对角线太突出降维后数据挤成一团选太大会丢失局部结构。有个经验公式是取样本间距的中位数不过具体还得看数据分布。另外KPCA的计算复杂度是O(N³)数据量上万的话最好用近似算法。