matlabfisher判别代码
时间: 2023-07-03 16:26:56 浏览: 88
以下是一个在Matlab中使用Fisher判别分析进行二分类的示例代码:
```matlab
% 生成样本数据
rng(1); % 设置随机种子,保证结果可重复
mu1 = [0 0];
sigma1 = [1 0.5; 0.5 1];
X1 = mvnrnd(mu1, sigma1, 100); % 类别1的样本数据
mu2 = [3 3];
sigma2 = [1 -0.7; -0.7 1];
X2 = mvnrnd(mu2, sigma2, 100); % 类别2的样本数据
% 将样本数据合并并打标签
X = [X1; X2];
Y = [ones(100, 1); ones(100, 1)*2];
% 计算Fisher投影向量
M = mean(X); % 所有样本的均值
Sw = (X1-M)'*(X1-M) + (X2-M)'*(X2-M); % 类内散度矩阵
Sb = (mu1-M)'*(mu1-M) + (mu2-M)'*(mu2-M); % 类间散度矩阵
[V, D] = eig(Sb, Sw); % 计算广义特征值和广义特征向量
[~, ind] = maxk(abs(diag(D)), 1); % 取最大的广义特征值对应的广义特征向量
w = V(:, ind); % Fisher投影向量
% 对测试集进行分类
x_test = [-2 -2; 4 4]; % 测试集特征向量
y_test = classify(x_test, X, Y, w); % 使用Fisher投影向量进行分类
% 绘制样本数据和分类结果
figure;
gscatter(X(:, 1), X(:, 2), Y, 'rb', '.', 15); % 绘制样本数据
hold on;
xlim([-4 8]);
ylim([-4 8]);
x1 = linspace(-4, 8, 100);
y1 = (-w(1)*x1)/w(2); % 计算Fisher投影直线
plot(x1, y1, 'k', 'LineWidth', 2); % 绘制Fisher投影直线
scatter(x_test(:, 1), x_test(:, 2), 60, y_test, 'filled'); % 绘制测试集和分类结果
colormap([0 0 1; 1 0 0]);
colorbar('Ticks', [1 2], 'TickLabels', {'Class 1', 'Class 2'}, 'Location', 'EastOutside');
legend('Class 1', 'Class 2', 'Fisher Projection', 'Test Set');
```
该代码利用`mvnrnd`函数生成两个二维高斯分布的样本数据,然后将它们合并并打上标签。接着,计算Fisher投影向量并使用`classify`函数对测试集进行分类。最后,绘制样本数据和分类结果的图像。
阅读全文