这只是尝试获得分离边界或曲线的近似值。
Dataset
下面我绘制了示例数据集的两种类型之间的分离曲线。该数据集借用自 coursera - Andrew Ng 的机器学习课程。另外,下面的代码片段借用了以下想法Ex6
Andrew 的 ML 课程。
边界图
要绘制分离曲线,
- 首先根据训练数据训练神经网络;
- 使用您想要的粒度生成二维数据网格,
Matlab
,这类似于:
x1plot = linspace(min(X(:,1)), max(X(:,1)), 100)';
x2plot = linspace(min(X(:,2)), max(X(:,2)), 100)';
[X1, X2] = meshgrid(x1plot, x2plot);
- 对于网格中的每个数据点,使用神经网络计算预测标签;
- 绘制网格结果标签的时装图
vals = zeros(size(X1));
for i = 1:size(X1, 2)
this_X = [X1(:, i), X2(:, i)];
% mlpPredict() is the function to use your trained neural network model
% to get a predicted label.
vals(:, i) = mlpPredict(model, this_X);
end
% Plot the boundary
hold on
[C, Lev] = contour(X1, X2, vals, [0 0], 'Color', 'b');
hold off;
如果您的目标只是获得边界曲线的精确数学表示,则此方法将不起作用。此方法只能为您提供在网格中设置的粒度范围内的曲线近似值。
如果您确实想要边界的精确描述,SVM 可能是一个不错的选择,因为整组支持向量都可以作为边界描述。
使用轮廓点近似边界
我看了一下octave
的文档关于contour
。基本上,contour
使用轮廓矩阵C
计算由contourc
来自相同的论点。这是签名contourc
:
[C, LEV] = contourc (X, Y, Z, VN)
该函数计算矩阵的轮廓线Z
。参数X
, Y
and VN
是可选的。
The return value LEV is a vector of the contour levels. The
return value C is a 2 by N matrix containing the contour lines in
the following format
C = [lev1, x1, x2, ..., levn, x1, x2, ...
len1, y1, y2, ..., lenn, y1, y2, ...]
in which contour line N has a level (height) of LEVN and length of
LENN.
因此,如果您确实想获得曲线的分析描述,矩阵C
应包含足够的相关信息。在我的示例图中,解析后C
,我得到了 30 个级别。第一层前6个点的坐标如下:
x: 2.3677e-01 2.3764e-01 2.4640e-01 2.4640e-01 2.4640e-01 2.4640e-01 ...
y: 4.0263e-01 4.0855e-01 4.0909e-01 4.1447e-01 4.2039e-01 4.2631e-01 ...
请注意,它们正是轮廓上从 (0.23677, 0.40263) 开始的点。使用这些轮廓点,可以直接使用多个线段来近似曲线(因为每个线段可以由两个端点确定)。
希望能帮助到你。