function [T, Z] = LFDA(p_train, t_train, r, metric, kNN)
%% 用于监督降维的局部 Fisher 判别分析
% Input:
% p_train:num_d x num_s matrix of original samples
% num_d --- dimensionality of original samples
% num_s --- the number of samples
% t_train:num_s dimensional vector of class labels
% r: dimensionality of reduced space (default: num_d)
% metric: type of metric in the embedding space (default: 'weighted')
% 'weighted' --- weighted eigenvectors
% 'orthonormalized' --- orthonormalized
% 'plain' --- raw eigenvectors
% kNN: parameter used in local scaling method (default: 7)
%
% Output:
% T: num_d x r transformation matrix
% Z: r x num_s matrix of dimensionality reduced samples
% 获取数据的样本数目和维度
[num_d, num_s] = size(p_train);
% 参数输入检查,默认参数设置
if nargin < 3
r = num_d;
end
if nargin < 4
metric = 'weighted';
end
if nargin < 5
kNN = 7;
end
% 参数的初始化
tSb = zeros(num_d, num_d);
tSw = zeros(num_d, num_d);
% 获取不同参数类别
for c = unique(t_train')
% 获取该类别样本的输入和数目
Xc = p_train(:, t_train == c);
nc = size(Xc, 2);
% 定义类亲和矩阵
Xc2 = sum(Xc .^ 2, 1);
distance2 = repmat(Xc2, nc, 1) + repmat(Xc2', 1, nc) - 2 * (Xc' * Xc);
[sorted, ~] = sort(distance2);
kNNdist2 = sorted(kNN + 1, :);
sigma = sqrt(kNNdist2);
localscale = sigma' * sigma;
flag = (localscale ~= 0);
A = zeros(nc, nc);
A(flag) = exp(-distance2(flag) ./ localscale(flag));
Xc1 = sum(Xc, 2);
G = Xc * (repmat(sum(A, 2), [1, num_d]) .* Xc') - Xc * A * Xc';
tSb = tSb + G / num_s + Xc * Xc' * (1 - nc / num_s) + Xc1 * Xc1' / num_s;
tSw = tSw + G / nc;
end
X1 = sum(p_train, 2);
tSb = tSb - X1 * X1' / num_s - tSw;
tSb = (tSb + tSb') / 2;
tSw = (tSw + tSw') / 2;
if r == num_d
[eigvec, eigval_matrix] = eig(tSb, tSw);
else
opts.disp = 0;
[eigvec, eigval_matrix] = eigs(tSb, tSw, r, 'la', opts);
end
eigval = diag(eigval_matrix);
[sort_eigval, sort_eigval_index] = sort(eigval);
T0 = eigvec(:, sort_eigval_index(end: -1: 1));
% 确定嵌入空间中的度量
switch metric
% 加权特征向量
case 'weighted'
T = T0 .* repmat(sqrt(sort_eigval(end: -1: 1))', [num_d, 1]);
% 正交归一化
case 'orthonormalized'
[T, ~] = qr(T0, 0);
% 原始特征向量
case 'plain'
T = T0;
end
% 获取转移矩阵
Z = T' * p_train;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Matlab实现基于LFDA基于局部费歇尔判别的分类数据降维可视化(完整程序和数据) 输入12个特征,输出四类标签,数据降维后可视化展示。 Matlab实现基于LFDA基于局部费歇尔判别的分类数据降维可视化(完整程序和数据) 输入12个特征,输出四类标签,数据降维后可视化展示。
资源推荐
资源详情
资源评论
收起资源包目录
数据降维:LFDA.zip (4个子文件)
1.png 43KB
基于局部费歇尔判别的分类数据降维可视化
基于局部费歇尔判别的分类数据降维可视化
LFDA.m 3KB
main.m 818B
数据集.xlsx 73KB
共 4 条
- 1
资源评论
- zhuyizhi7892023-07-10超赞的资源,感谢资源主分享,大家一起进步!
机器学习之心
- 粉丝: 1w+
- 资源: 663
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功