我最近试图绘制一个非线性决策边界,并且该函数最终是一个部分水平的双曲线,其中给定x有多个y值。虽然我得到它的工作,我知道必须有一个更pythonic或numpythonic方式绘制这条线。
背景:问题是一组输入上的感知器分类器,这些输入不是线性可分的。为了找到这一点,输入被映射到一般的双曲线函数以将维度增加到5,并且通过超平面使这些可分离。将绘制的决策边界的等式是 d(x)= w0 + w1xx + w2yy + w3xy + wx + w5y 通过感知器梯度下降的过程,找到w0-w5的值,并且当d(x)= 0时,边界是x,y值。
当前的实施:我让它发挥作用,但我认为这很糟糕。我首先必须创建一个给定大小的数组,以便我可以追加这些值,并且我必须在第一次追加找到的值时删除初始值。然后我扫描了我的图表上的空间并找到一个y值,首先猜测高,然后猜测低,以便找到两个可能的y值。我将这些找到的值放在D的前面和后面,以便使用matplotlib绘制它。
D = np.array([[0], [0]])
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
a_iter, b_iter = 0, 0 # used as initial guess for numeric solver
for xx in range(x_min, x_max):
# used to print top and bottom sides of hyperbola
yya = fsolve(lambda yy: W[:,0] + W[:,1]*xx**2 + W[:,2]*yy**2 + W[:,3]*xx*yy + W[:,4]*xx + W[:,5]*yy, max(a_iter, 7))
yyb = fsolve(lambda yy: W[:,0] + W[:,1]*xx**2 + W[:,2]*yy**2 + W[:,3]*xx*yy + W[:,4]*xx + W[:,5]*yy, b_iter)
a_iter = yya
b_iter = yyb
# add these points to a single matrix for printing
dda = np.array([[xx],[yya]])
ddb = np.array([[xx],[yyb]])
D = np.concatenate((dda, D), axis=1)
if xx == x_min: # delete initial [0; 0]
D = dda
D = np.concatenate((D, ddb), axis=1)
我知道必须有更好的方法来做到这一点。任何见解都表示赞赏。
编辑:道歉,我意识到如果没有图像,这真的很难理解。找到多个根并填充numpy数组的主要问题有点普遍。我没有足够的代表发布图片,但链接在下面 nonlinear classifier
答案 0 :(得分:0)
如果您想绘制隐式方程曲线,可以使用pyplot.contour()
,这是一个示例:
np.random.seed(1)
w = np.random.randn(6)
def f(x, y, w):
return w[0] + w[1]*x**2 + w[2]*y**2 + w[3]*x*y + w[4]*x + w[5]*y
X, Y = np.mgrid[-2:2:100j, -2:2:100j]
pl.contour(X, Y, f(X, Y, w), levels=[0])
答案 1 :(得分:0)
也有参数化选项 - 三角形,分支以0为中心,pi
t = np.linspace(-np.pi/3, np.pi/3, 200) # 0 centered branch
y = 1/np.cos(t)
x = 1*np.tan(t)
plt.plot(x, y) # (default blue)
Out[94]: [<matplotlib.lines.Line2D at 0xe26e6a0>]
t = np.linspace(np.pi-np.pi/3, np.pi+np.pi/3, 200) # pi centered branch
y = 1/np.cos(t)
x = 1*np.tan(t)
plt.plot(x, y) # (default orange)
Out[96]: [<matplotlib.lines.Line2D at 0xf68e780>]
sympy
应该从二元多项式w
中找到完全非规格化,旋转,偏移参数化的双曲线系数
(或继续适当的hackage)