5

使用单层感知器很容易找到“分离线”的方程(我不知道专业术语),根据感知器的权重,在训练后将两种类型的点分开的线。在多层感知器中,如何以类似的方式找到在两种类型的点之间分离的曲线方程(不是直线)?

谢谢。

4

1 回答 1

8

这只是试图获得分离边界或曲线的近似值。

数据集

下面我绘制了两种类型的示例数据集之间的分离曲线。数据集借自 coursera - Andrew Ng 的机器学习课程。下面的代码片段也借鉴了Ex6Andrew 的 ML 课程的想法。

在此处输入图像描述

边界图

要绘制分离曲线,

  • 你首先根据你的训练数据训练你的神经网络;
  • 使用您想要的粒度生成 2d 数据网格,在 中Matlab,这类似于:
    x1plot = linspace(min(X(:,1)), max(X(:,1)), 100)';
    x2plot = linspace(min(X(:,2)), max(X(:,2)), 100)';
    [X1, X2] = 网格网格(x1plot, x2plot);
  • 对于网格中的每个数据点,使用您的神经网络计算预测标签;
  • 绘制网格结果标签的轮廓图
    vals = 零(大小(X1));
    对于 i = 1:size(X1, 2)
       this_X = [X1(:, i), X2(:, i)];
       % mlpPredict() 是使用你训练好的神经网络模型的函数
       % 得到一个预测的标签。
       vals(:, i) = mlpPredict(模型, this_X);
    结尾

    % 绘制边界
    坚持,稍等
    [C, Lev] = 轮廓(X1, X2, vals, [0 0], 'Color', 'b');
    暂缓;

如果您的目标只是获得边界曲线的精确数学表示,则此方法行不通。此方法只能为您提供曲线的近似值,直至您在网格中设置的粒度。

如果您确实想要边界的精确描述,SVM 可能是一个不错的选择,因为整个支持向量集都可以用作边界描述。

使用轮廓点近似边界

我看了看octave关于contour. 基本上,使用由相同参数计算contour的轮廓矩阵。这是 的签名:Ccontourccontourc

[C, LEV] = contourc (X, Y, Z, VN)

此函数计算矩阵的等高线Z。参数X,YVN是可选的。

 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) 开始的点。使用这些轮廓点,可以直接使用多个线段来近似曲线(因为每个线段可以由两个端点确定)。

希望能帮助到你。

于 2013-01-21T23:30:49.733 回答