多层感知器 - 找到"分离"曲线

use*_*774 5 artificial-intelligence machine-learning perceptron

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

谢谢.

gre*_*ess 7

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

数据集

下面我绘制了两种类型的示例数据集之间的分离曲线.数据集借鉴了课程 - 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] = meshgrid(x1plot, x2plot);
  • 对于网格中的每个数据点,使用您的神经网络计算预测标签;
  • 绘制结果网格标签的coutour图
    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使用Ccontourc相同参数计算的轮廓矩阵.这是签名contourc:

[C, LEV] = contourc (X, Y, Z, VN)
Run Code Online (Sandbox Code Playgroud)

该函数计算矩阵的轮廓线Z.参数X,Y并且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.
Run Code Online (Sandbox Code Playgroud)

因此,如果您想获得曲线的分析描述,矩阵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 ...
Run Code Online (Sandbox Code Playgroud)

请注意它们正好是从(0.23677,0.40263)开始的轮廓上的点.使用这些轮廓点,可以直接使用多个线段来近似曲线(因为每个线段可以由两个端点确定).

希望能帮助到你.

  • 首先,您可能需要尝试识别最接近轮廓的网格上的点(看一下"轮廓"函数的源代码应该有帮助.)之后,使用多个线段可以直接逼近曲线(因为每个线段可以由两个端点确定). (6认同)