当前位置:网站首页>LPP code and its comments
LPP code and its comments
2022-08-09 09:32:00 【qq_35774189】
% LPP: Locality Preserving Projections
%
% [eigvector, eigvalue] = LPP(W, options, data)
%
% Input:
% data - Data matrix. Each row vector of fea is a data point.
% W - Affinity matrix(关联矩阵). You can either call "constructW"
% to construct the W, or construct it by yourself.
% options - Struct value in Matlab. The fields in options
% that can be set:
%
% Please see LGE.m for other options.
%
% Output:
% eigvector - Each column is an embedding function, for a new
% data point (row vector) x, y = x*eigvector
% will be the embedding result of x.
% eigvalue - The sorted eigvalue of LPP eigen-problem.
%
%
% Examples:
%
% fea = rand(50,70);
% options = [];
% options.Metric = 'Euclidean'; //欧氏距离定义: 欧氏距离( Euclidean distance)是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离.
% options.NeighborMode = 'KNN';//Put an edge between two nodes if and only if they are among the k nearst neighbors of each other. You are required to provide the parameter k in the options. [Default One]
% options.k = 5; //Default
% options.WeightMode = 'HeatKernel'; //Indicates how to assign weights for each edge in the
% graph.'HeatKernel' - If nodes i and j are connected, put weight
% W_ij = exp(-norm(x_i - x_j)/2t^2). You are
% required to provide the parameter t. [Default One]
%
%
% options.t = 5;
% W = constructW(fea,options);
% options.PCARatio = 0.99 //The percentage of principal component
% kept in the PCA step.The percentage is
% calculated based on the eigenvalue.
% [eigvector, eigvalue] = LPP(W, options, fea);
% Y = fea*eigvector;
%
%
% fea = rand(50,70);
% gnd = [ones(10,1);ones(15,1)*2;ones(10,1)*3;ones(15,1)*4]; //The parameter needed under 'Supervised'NeighborMode.
% Colunm vector of the label information for each data point.
% options = [];
% options.Metric = 'Euclidean';
% options.NeighborMode = 'Supervised'; //k > 0 Put an edge between
% two nodes if they belong to same class and they are among the k nearst neighbors of each other.
% options.gnd = gnd;
% options.bLDA = 1; //If 1, the graph will be constructed to
% make LPP exactly same as LDA. Default will be 0.
% W = constructW(fea,options);
% options.PCARatio = 1;
%
% [eigvector, eigvalue] = LPP(W, options, fea);
% Y = fea*eigvector;
%
%
% Note: After applying some simple algebra, the smallest eigenvalue problem:
% data^T*L*data = \lemda data^T*D*data
% is equivalent to the largest eigenvalue problem:
% data^T*W*data = \beta data^T*D*data
% where L=D-W; \lemda= 1 - \beta.
% Thus, the smallest eigenvalue problem can be transformed to a largest
% eigenvalue problem. Such tricks are adopted in this code for the
% consideration of calculation precision of Matlab.
%
%
% See also constructW, LGE
if (~exist('options','var')) %不存在返回1,存在返回0
options = [];
end
[nSmp,nFea] = size(data); %返回data的行数和列数,分别保存在nSmp和nFea中
if size(W,1) ~= nSmp %size()返回矩阵的行数
error('W and data mismatch!');
end
%==========================
% If data is too large, the following centering codes can be commented
% options.keepMean = 1;
%==========================
if isfield(options,'keepMean') && options.keepMean; %isfield()检查options是否包含由keepMean指定的域,判断输入是否是结构体数组的域.
else
if issparse(data)
data = full(data); %Convert a sparse matrix to a full matrix and store it in data
end
sampleMean = mean(data);%data是一个向量,mean(A)返回A中元素的平均值,如果是一个矩阵,mean(A)Treat each of the columns as vectors,求其平均值.
data = (data - repmat(sampleMean,nSmp,1)); %repmat()是对sampleMeanThe matrix carries the specified number of rowsnSmp和列数1的复制.
end
%==========================
D = full(sum(W,2)); %sum(W,2)对W的行求和 %*D变成50行1列
if ~isfield(options,'Regu') || ~options.Regu
DToPowerHalf = D.^.5; %*DToPowerHalf为50行1列
D_mhalf = DToPowerHalf.^-1; %*D_mhalf为50行1列
if nSmp < 5000 %nSmp行数
tmpD_mhalf = repmat(D_mhalf,1,nSmp); %*将D_mhalf放大到50列,此时tmpD_mhalf是50*50
W = (tmpD_mhalf.*W).*tmpD_mhalf';
clear tmpD_mhalf;
else
[i_idx,j_idx,v_idx] = find(W); %找出i_idx非0元素所在的行,j_idx非0the column the element is in,v_idx非0元素的值.
v1_idx = zeros(size(v_idx)); %返回v_idx的行数和列数
for i=1:length(v_idx)
v1_idx(i) = v_idx(i)*D_mhalf(i_idx(i))*D_mhalf(j_idx(i));
end
W = sparse(i_idx,j_idx,v1_idx); %转化为稀疏矩阵,把0全去掉
clear i_idx j_idx v_idx v1_idx
end
W = max(W,W');
data = repmat(DToPowerHalf,1,nFea).*data;
[eigvector, eigvalue] = LGE(W, [], options, data);
else
options.ReguAlpha = options.ReguAlpha*sum(D)/length(D);
D = sparse(1:nSmp,1:nSmp,D,nSmp,nSmp); %由1:nSmp,1:nSmp,D组成的nSmp*nSmp的稀疏矩阵
[eigvector, eigvalue] = LGE(W, D, options, data);
end
eigIdx = find(eigvalue < 1e-3);
eigvalue (eigIdx) = [];
eigvector(:,eigIdx) = [];
边栏推荐
猜你喜欢
游戏测试的概念是什么?测试方法和流程有哪些?
"The camera can't be used" + win8.1 + DELL + external camera + USB drive-free solution
电脑硬件基础知识科普
makefile学习-解决目标文件输出路径问题
一个项目的整体测试流程有哪几个阶段?测试方法有哪些?
秒拍app分析
常用功能测试的检查点与用例设计思路
条件和递归
软件测试个人求职简历该怎么写,模板在这里
Ovie map computer terminal and mobile terminal can not be used, is there any alternative map tool
随机推荐
1. Introduction to threads
问卷问题和答案的合并
Go-指针的那些事
Another implementation of lateral view explode
8.递归遍历和删除案例
Command line query database
搭建Tigase进行二次开发
白盒测试的概念、目的是什么?及主要方法有哪些?
JS报错-Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on...
Ontology development diary 04 - to try to understand some aspects of protege
Cisco common basic configuration of common commands
Go-控制语句那些事
unittest测试框架原理及测试流程解析,看完绝对有提升
一个项目的整体测试流程有哪几个阶段?测试方法有哪些?
接口性能测试方案设计方法有哪些?要怎么去写?
div模拟textarea文本框,输入文字高度自适应,且实现字数统计和限制
米斗APP逆向分析
GBase数据库中,源为 oracle 报出“ORA-01000:超出打开游标最大数”
Golang Protobuf 处理
GBase数据库产生迁移工具假死的原因是什么?