使用单层感知器很容易找到“分离线”的方程式(我不知道专业术语),根据感知器的重量,在两种类型的点之间分离的线,在它之后培训。如何在多层感知器中以类似的方式找到在两种类型的点之间分离的曲线方程(不是直线)?
感谢。
答案 0 :(得分:7)
这只是试图得到分离边界或曲线的近似值。
下面我绘制了两种类型的示例数据集之间的分离曲线。数据集借鉴了课程 - Andrew Ng的机器学习课程。下面的代码片段借用了安德鲁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 = 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
和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)开始的轮廓上的点。使用这些轮廓点,可以直接使用多个线段来近似曲线(因为每个线段可以由两个端点确定)。
希望它有所帮助。