机器学习十大算法之Matlab-9降维算法_lle降维算法matlab_林大帅6688的博客-程序员宅基地

技术标签: matlab  算法  

降维算法

PCA算法

  • 算法流程:最小的m-l个特征值被舍弃了,这是降维的结果。舍弃部分信息后使得样本的1信息密度变大;2后面的m-l个特征是噪声,有去噪的效果。
    在这里插入图片描述

对数据集进行PCA后再重构

  • 1通过上面算法降维成l个维度l <<m,m为之前的维度。
    在这里插入图片描述
  • 2再进行升维重构
    在这里插入图片描述

PCA降维-Matlab代码

例子1-系统pca做降维pca_mat.m

  • 改例子有计算过程。
%使用pca函数进行降维
X=[1,2;3,3;3,5;5,4;5,6;6,5;8,7;9,8]; %样本矩阵,每行一个样本向量
[coeff,  score,  latent]=pca(X); %主成分分析
coeff, %主成分分量 (每列为一个变换空间中的基向量)
score, %主成分, score(:,1) 为X的一维表示, score为X在变换空间中的二维表示
latent, %X样本协方差矩阵的特征值

例子2-系统pca对简单数据集降维pca2_mat.m

  • 13*4的数据进行降维
clc, clear all, close all
load hald %载入数据集
X=ingredients; %将数据集中的13x4矩阵矩阵赋给X
[coeff,score]=pca(X,'Centered','off'), %调用函数pca, 不对数据中心化

例子3-用fastPCA做降维

  • fastPCA.m
%快速PCA函数
function [V,pcaX]=fastPCA(X,k)
%输入: X--样本矩阵,每行为一个样本
%输出: V--主成分向量
%pcaX--降维后的k维样本特征向量组成的矩阵,每一行一个样本,列数k为降维后的样本特征列数
[n,m]=size(X);
meanV=mean(X); %样本均值向量
Z=(X-repmat(meanV,n,1));
CovM=Z*Z';  %计算协方差矩阵的转置
[V,D]=eigs(CovM,k); %计算CovM的前k个特征值和特征向量
V=Z'*V; %得到协方差矩阵(CovM)'的特征向量
%特征向量归一化为单位特征向量
for i=1:k
    V(:,i)=V(:,i)/norm(V(:,i));
end
pcaX=Z*V; %线性变换(投影)降维至k维
save('PCA.mat','V','meanV'); %保存变换矩阵V和变换原点meanV
  • pca_iris.m对鸢尾属植物数据集降至2维
%用fastPCA函数对鸢尾属植物数据集降至2维
clc, clear all, close all
load fisheriris
X = meas;  Y = species;
[n,m]=size(X);
[V,pcaX]=fastPCA(X,2);
gscatter(pcaX(:,1),pcaX(:,2),Y,'rbm','*vo');

流行学习

  • 由于实际应 用中很多时候数据是非线性的, 因此有必要发展非线性降维算法, 流形学习就是一种非 线性降维技术的典型代表. “流形”是几何学中的一个概念, 它是高维空间中的几何结构, 即空间中的点构成 的集合, 例如二维空间中的曲线、三维空间中的曲面都是流形的例子。

局部线性嵌入

在这里插入图片描述

  • lle.m
%LLE MATLAB程序
function [Z] = lle(X,k,l)
%X-样本矩阵,m*n 矩阵,m为样本向量的维数,n为样本的个数
%k-近邻数,l-低维空间维数,Z为降维后的数据矩阵,维度为l*n
[m,n] = size(X);
fprintf(1,'LLE运行于 %d 维空间中的 %d 个样本点上\n',m,n);
%第一步: 计算点与点之间的距离并寻找k个近邻点.
fprintf(1,'-->寻找 %d 个近邻点.\n',k);
X2 = sum(X.^2,1);
distance = repmat(X2,n,1)+repmat(X2',1,n)-2*X'*X;
%欧氏距离公式的展开||x_i-x_j||^2=x_i^2+x_j^2-2x_i'x_j
[~,index] = sort(distance); %距离排序(从小到大)
neighborhood = index(2:(1+k),:); %取第2到第k+1个最小距离
%第二步: 计算重构权重矩阵
fprintf(1,'-->求解重构权重矩阵.\n');
if(k>m)  %如果近邻点个数大于样本特征向量维数, 需要正则化
    fprintf(1,'-->近邻点个数大于样本特征向量维数需要正则化.\n');
    tol=1e-3; 
else
    tol=0;
end
W = zeros(k,n); %权重矩阵初始化
for i=1:n
   z = X(:,neighborhood(:,i))-repmat(X(:,i),1,k); %将第i个点平移至坐标原点
   C = z'*z; %局部协方差矩阵
   C = C + eye(k,k)*tol*trace(C);  %k>m时加上正则化项
   W(:,i) = C\ones(k,1);   %解方程组Cw=1
   W(:,i) = W(:,i)/sum(W(:,i)); %按行归一化权重矩阵
end
%第三步: 计算矩阵M=(I-W)'(I-W)
fprintf(1,'-->计算局部线性嵌入.\n');
%M=eye(n,n); %M是一个只有4kn个非零元的稀疏矩阵
M = sparse(1:n,1:n,ones(1,n),n,n,4*k*n);
for i=1:n %计算矩阵M
   w = W(:,i);
   j = neighborhood(:,i);
   M(i,j) = M(i,j) - w';
   M(j,i) = M(j,i) - w;
   M(j,j) = M(j,j) + w*w';
end
%计算局部嵌入
options.disp = 0; options.isreal = 1; %结构变量options赋初值
[Z,~] = eigs(M,l+1,0,options); %计算矩阵M的前l+1个最小特征值对应的特征向量
Z = Z(:,2:l+1)'*sqrt(n); 
fprintf(1,'程序运行结束.\n');

局部线性嵌入-Matlab代码和使用lle_examp.m

%用瑞士卷数据测试LLE算法
clc, close all, clear all;
k = 20 ;%(邻域点个数)
l = 2;%最大嵌入维数
%瑞士卷的生成图
rng (3)
n=1500; 
t=(3*pi/2)*(1+2*rand(1,n));
s=21*rand(1,n);
X=[t.*cos(t); s; t.*sin(t)]; %3*n矩阵
figure (1)
plot3(X(1,:),X(2,:),X(3,:),'.'), %绘制瑞士卷三维曲线图
view([12 12]);  %设置视角
%调用lle函数降维
Z=lle(X,k,l);
figure (2)
plot(Z(1,:),Z(2,:),'.b'), %绘制LLE降维后的二维平面图

MDS降维

  • 多维缩放方法(MDS)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 最后推导
    在这里插入图片描述

MDS降维-Matlab代码

  • MDS.m
function Z = MDS(D, d)
%多维缩放方法(MDS)的MATLAB 程序
%功能: 支持n个m维样本降维值d维. 
%输入: D--n*n距离矩阵, d--低维空间维数
%输出: Z--低维空间的d*n 样本矩阵
[n, n1] = size(D);
if n~=n1
    printf('D不是一个方阵');
end
D2 = D .* D;  e = ones(n,1);
H = eye(n) - 1 / n * (e *e');
B =-0.5 * H * D2 * H; 
%B=zeros(n,n);
% for i=1:n
%     for j=1:n
%         B(i,j)=-0.5*(D(i,j)^2 -1/n*D(i,:)*D(i,:)' -1/n*D(:,j)'*D(:,j) +1/n^2*sum(sum(D.^2)));
%     end
% end
[U, Lam] = eig(B);
Lam = diag(Lam);
[~, pos] = sort(Lam,'descend');
index = pos(1:d);
U = U(:, index);
Z = diag(Lam(index))^(0.5) * U';

MDS降维

  • Isomap 源于微分几何中测地线的思想, 它希望样本数据在向低 维空间投影之后仍能保持流形上的测地线距离.
  • 最后需要指出的是, 近邻图的构建通常有两种方法: 一种是指定近邻点个数 , 将与 欧氏距离最近的 个点作为近邻点. 另一种方法是指定距离阈值 , 将与 的欧氏距 离小于 的点作为近邻点. 显然这两种方法均有不足: 若 值过大, 则距离很远的点可 能被误认为是近邻点, 即出现所谓的“短路”现象; 若阈值 过小, 则图中有些区域可能 与其他区域不存在连接, 即出现所谓的“断路”现象. 短路与断路都会给后续的最短路 径计算造成误导.
    在这里插入图片描述

MDS降维-Matlab实现和使用

  • isomap.m
function  Z = isomap(X, k, d)
%Isomap算法MATLAB程序, 该程序调用了MDS算法
%第一步: 按欧氏距离选取k个近邻点
[n, ~] = size(X); D = zeros(n);
for i =1 : n %构造距离矩阵D
    xx = repmat(X(i, :), n, 1); 
    %复制X的第i行n次叠成一个n*n矩阵, 其每一行元素都是X的第i行元素
    diff = xx - X;
    dist = sum(diff.* diff, 2); %按行求和
    [dd, pos] = sort(dist); %按升序排序
    index = pos(1 : k + 1)'; %前k+1个设为近邻点
    index2 = pos(k + 2 : n); %后n-k-1设为非近邻点
    D(i,index) = sqrt(dd(index)); %距离矩阵第i行近邻点元素值
    D(i, index2) = inf; %距离矩阵第i行非近邻点元素值设为无穷大
end
%第二步:  重新计算最短距离矩阵
for k=1:n
    for i=1:n
        for j=1:n
            if D(i,j)>D(i,k)+D(k,j)
                D(i,j)=D(i,k)+D(k,j);
            end
        end
    end
end
%第三步: 调用MDS算法降维
Z = MDS(D, d);

  • isomap_examp.m
%用瑞士卷数据测试Isomap算法
close all, clear all;
k = 20 ;%(邻域点个数)
l = 2;%最大嵌入维数
%瑞士卷的生成图
rng (3)
n=1500; 
t=(3*pi/2)*(1+2*rand(1,n));
s=21*rand(1,n);
X=[t.*cos(t); s; t.*sin(t)]; %3*n矩阵
figure (1)
plot3(X(1,:),X(2,:),X(3,:),'.'), %绘制瑞士卷三维曲线图
view([12 12]);  %设置视角
X = X';
Z=isomap(X,k,l);  
figure (2)
plot(Z(1,:),Z(2,:),'.b'), %绘制Isomap降维后的二维平面图

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41732253/article/details/128620990

智能推荐

如何关闭selenium开发中的chromedriver.exe 或 geckodriver.exe 的console命令行窗___Pythoner__的博客-程序员宅基地

【方法一】亲测有效问题:如何关闭selenium开发中的chromedriver.exe 或 geckodriver.exe 的console命令行窗采用selenium操作浏览器执行自动化操作的场景时,在使用 pyinstaller 打包成exe文件后,会有chromedriver.exe 或 geckodriver.exe 的console命令行窗口。我们打包成exe文件一般是要分发到客户电脑上,出现这个窗体不太友好,我们需要把它隐藏掉:找到python安装目录,比如:D:\Python\Py

python删除字符串中的数字_python去掉数字_2.5年没练习了要加油的博客-程序员宅基地

educoder实训平台 python第二关删除字符串中的数字_python去掉数字

python图像质量评价_图像质量评价指标之 PSNR 和 SSIM_weixin_39946313的博客-程序员宅基地

1. PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比给定一个大小为 \(m×n\) 的干净图像 \(I\) 和噪声图像 \(K\),均方误差 \((MSE)\) 定义为:\[MSE = \frac{1}{mn}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1}[I(i, j)-K(i,j)]^2\]然后 \(PSNR (dB)\) 就定义为:\[PSN..._python 图像误差指标

小米笔记本Air 13.3(第7代CPU平台驱动 指纹版)安装WIN7_小米笔记本指纹驱动下载_上海好程序员的博客-程序员宅基地

1、为WIN7镜像集成USB3.0,NVME,等一系列新驱动首先用吧win7镜像引导进U盘,然后下载《WindowsImageTool》软件进行改造,改造方法如图:这个软件去技嘉官网下,在《主板-软件工具》里面,文件名叫《mb_utility_windowsimagetool》,看好主板芯片,选更新时间最晚那个版本。2、在PE下安装(U盘直接引导还是看不到SSD啊,只能曲线救国)..._小米笔记本指纹驱动下载

js数组对象的遍历删除多余字段_啥咕啦呛的博客-程序员宅基地

我们在项目中经常会遇到如下格式:class:{ 0:[ { id:0, hover:true, }, { id:1, hover:false, }, ], 1:[ { id:3, hover:false, } ]}

Hive实战 --- 电子商务消费行为分析_快乐画饼的博客-程序员宅基地

Hive实战 --- 电子商务消费行为分析、数据清洗、数据分析......

随便推点

JBoss AS 安装配置部署_jboss-as_阿姨不可以嘛的博客-程序员宅基地

参考:JBoss AS7.1.1的下载安装、环境变量配置以及部署JBoss AS 7.1.1.Final 启动失败:JBAS015899:Brontes starting最新的wildfly17的配置参考:Wildfly 10的安装、配置到部署1、下载安装http://jbossas.jboss.org/downloads/JBoss A..._jboss-as

【设计模式系列学习笔记】1、简单工厂模式_hellboy工厂_hellboy0621的博客-程序员宅基地

如果说数学是思维的体操,那设计模式就是面向对象编程思维的体操;简易计算器类结构图:操作类,定义两个操作数,并声明抽象方法getResult(),具体实现由子类完成;public abstract class Operation { private double numberA; private double numberB; public abstr..._hellboy工厂

rust用BTreeMap保存closure_rust treemap_varding的博客-程序员宅基地

use std::collections::BTreeMap;struct Foo{ entry:BTreeMapi32>>,}impl Foo{ fn new()->Foo{ Foo{ entry:BTreeMap::new(), } } fn add_rust treemap

Mac mysql workbench 使用入门_csdn_xpw的博客-程序员宅基地

mysql workbench 工具介绍   mysql workbench是管理数据库的可视化工具。它能帮助我们省去打SQL的过程,提高开发效率。官方下载地址 install  安装极其简单,不讲 create connection create database create table execute SQL 附加信息 show databases;use ym_

tyvj 1080 N皇后_n皇后选题意义和背景_Nemaleswang的博客-程序员宅基地

题目链接:N皇后按字典序算N皇后的前三组数据和总共多少组数据,直接按照N皇后去搜就可以了#include using namespace std;int n,ind,ans[100005][15],cs;bool row[15],dia1[100005],dia2[100005];void dfs(int q){ if(q > cs){ ind++;_n皇后选题意义和背景

python gui库比较_Python(00):GUI库的选择_weixin_39637203的博客-程序员宅基地

一、Python官方标准库:Tkinter (必须了解)Python内置图形界面库——Tkinter。Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。用法..._python gui库对比

推荐文章

热门文章

相关标签