【问题标题】:multi layer perceptron - finding the "separating" curve多层感知器 - 找到“分离”曲线
【发布时间】:2013-01-04 15:02:44
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: machine-learning artificial-intelligence perceptron


    【解决方案1】:

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

    数据集

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

    边界图

    绘制分离曲线,

    • 您首先根据您的训练数据训练您的神经网络;
    • 使用您想要的粒度生成二维数据网格,在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 = 零(大小(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 使用由contourc 从相同参数计算的轮廓矩阵C。这是contourc的签名:

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

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

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

    希望对您有所帮助。

    【讨论】:

    • 非常感谢。是否也有近似曲线的解析方法?
    • 首先您可能想尝试识别网格上最靠近轮廓的点(看看contour函数的源代码应该会有所帮助。)之后,很简单使用多条线段逼近曲线(因为每条线段可以由两个端点确定)。
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2019-04-13
    • 2013-12-11
    • 2015-11-21
    • 2011-07-01
    • 2011-11-15
    相关资源
    最近更新 更多