请用matlab代码简单写一个fisher线性判别的案例,并进行数据可视化
时间: 2024-05-08 18:14:57 浏览: 222
假设有两个类别(0和1),每个类别有两个特征(x1和x2)的数据集。我们可以用fisher线性判别来找到一个线性投影,使得类别之间的方差最大,而类别内的方差最小。
首先,我们生成一些随机数据:
```matlab
% 生成随机数据
rng(1); % 设置随机数种子
N = 50; % 每个类别的样本个数
mu1 = [1 2]; % 类别0的均值
mu2 = [4 5]; % 类别1的均值
sigma1 = [1 0.5; 0.5 2]; % 类别0的协方差矩阵
sigma2 = [2 -1.2; -1.2 2]; % 类别1的协方差矩阵
X1 = mvnrnd(mu1, sigma1, N); % 类别0的样本
X2 = mvnrnd(mu2, sigma2, N); % 类别1的样本
X = [X1; X2]; % 所有样本
y = [zeros(N, 1); ones(N, 1)]; % 类别标签
```
数据可视化:
```matlab
% 绘制散点图
figure;
scatter(X1(:, 1), X1(:, 2), 'b', 'filled');
hold on;
scatter(X2(:, 1), X2(:, 2), 'r', 'filled');
xlabel('x1'); ylabel('x2');
legend('class 0', 'class 1');
```
然后,我们用fisher线性判别来找到一个投影向量w,使得投影后的数据具有最大的类别间方差和最小的类别内方差。
```matlab
% 计算类别均值
mu0 = mean(X1)';
mu1 = mean(X2)';
% 计算类内散度矩阵
S0 = cov(X1);
S1 = cov(X2);
Sw = S0 + S1;
% 计算投影向量
w = inv(Sw) * (mu1 - mu0);
% 投影数据
Xp = X * w;
```
数据可视化:
```matlab
% 绘制投影后的数据
figure;
scatter(Xp(y==0), zeros(N, 1), 'b', 'filled');
hold on;
scatter(Xp(y==1), zeros(N, 1), 'r', 'filled');
xlabel('projection'); ylim([-0.1 0.1]);
legend('class 0', 'class 1');
```
可以看到,经过投影后,两个类别的样本已经被分开了。
阅读全文