已知正例点和负例点坐标,求最大间隔分离超平面和分类决策函数,并在图上画出分离超平面、间隔边界及支持向量MATLAB完整代码不使用函数
时间: 2024-10-28 07:11:41 浏览: 125
在MATLAB中,手动实现最大间隔支持向量机(SVM)涉及到核函数的选择、计算间隔边界和支持向量等步骤。下面是一个简单的例子,我们将使用线性核(也称为内积核)来演示:
```matlab
% 假设已知正例(y=1)和负例(y=-1)的点
posData = [1, 2; 4, 5]; % 正例数据,(x1, x2)
negData = [-1, -2; -4, -5]; % 负例数据,(x1, x2)
% 合并数据
allData = [posData; negData];
y = [ones(size(posData,1),1); -ones(size(negData,1),1)]; % 标签
% 计算所有点之间的距离矩阵
distMatrix = pdist(allData, 'euclidean'); % 使用欧式距离
distMatrix = squareform(distMatrix); % 转换为对称矩阵
% 初始化间隔(w)和偏置(b),初始值通常为0
w = zeros(2,1);
b = 0;
% 优化过程:寻找最大化间隔的支持向量
for i = 1:size(allData,1)
if y(i) == 1
% 正例点:找到最近的负例点并更新间隔
[~, minIndexNeg] = min(distMatrix(i, :) .* y);
if distMatrix(i, minIndexNeg) > 0
w = w + y(i) * allData(i,:)'; % 更新间隔向量
b = b - y(i) * dot(w, allData(i,:)); % 更新偏置
end
else
% 负例点:无需更新间隔
end
end
w = w / sqrt(sum(w.^2)); % 归一化间隔向量
% 计算分类决策函数(线性SVM)
predictFcn = @(x) sign(dot(w, x) + b);
% 绘制分离超平面和间隔边界
figure;
hold on;
scatter(posData(:,1), posData(:,2), 'r', 'filled', 'MarkerFaceColor', 'r');
scatter(negData(:,1), negData(:,2), 'b', 'filled', 'MarkerFaceColor', 'b');
% 计算间隔边界上的点
boundaries = linspace(min(min(posData(:,1), negData(:,1))), max(max(posData(:,1), negData(:,1))));
x1 = boundaries;
x2 = (-b - w(1)*x1)./w(2); % 纵轴上的点
plot(x1, x2, '--k'); % 边界线
% 找出支持向量
isSV = abs(distMatrix) < Inf & abs(distMatrix) > 1e-6; % 选取距离大于0且小于无穷小的距离
supportVectors = allData(isSV, :);
scatter(supportVectors(:,1), supportVectors(:,2), 'gx', 'filled'); % 支持向量标记为绿色星号
hold off;
xlabel('x1');
ylabel('x2');
title('Max Margin Hyperplane using SVM');
```
注意这个实现仅适用于线性可分的情况。对于非线性情况,你需要选择适当的核函数并使用`kernel`变量。
阅读全文