本篇文章纯粹为了记录遇到问题以及解决问题。苦于没人指引,加上网上资料少不知从何搜起,断断续续三天才弄明白,走了一些弯路。希望可以给看到这篇文章的小伙伴一点点帮助,少踩坑。
写在前面,最近碰到个问题,需要画出正则化logistic回归的决策边界。但因为拟合出来的函数是一个高维的方程,无法直接画出图形。
例如这样的一个方程(一):
画图形之前,还要提一下,训练集只给了两个特征x1, x2,我们利用 多项式特征映射,构建了一个28维的特征。
小白做法(我自己一开始的做法):解方程,因为画在二维坐标轴上,所以只需要x1,x2,所以把x1或x2移到等式右边,然后同时除以它的系数θ,例如方程(二):
然后把生成的高维数据输入,得出结果。
事实证明,这样效率低下,且非常麻烦,很绕。
或者,把一个公式当成一个函数:
然后输入数据得到所有结果,接着做判断,取能使这个方程等于0的对应的x1和x2。
感受:还是绕,但是比上面简单一些。
最后,利用等高线 np.contour()绘图。原理是利用方程(二),得到一个多维的曲线一定是立体的,你可以想象成一个不规则的碗的形状扣下二维坐标轴的正上方。然后可以在碗上画出一圈一圈的等高线,那么在高度为0的那一条线正式与坐标轴平面相交的那条线,也正我们的方程(一)成立,这就是我们所求的决策边界。
这个方法简单明了,特别适合高维决策边界的绘制。
但是需要注意的坑:
1.np.contour(xx, yy, z)里面的输入的维度有限制,看看官方文档怎么说。
X and Y must both be 2-D with the same shape as Z, or they must both be 1-D such that len(X) is the number of columns in Z and len(Y) is the number of rows in Z.
2.我计算 z 的时候,输入的xx和yy和算出的z维度一直不匹配,z.reshape也没用,就无法画出等高线。后来输入时,改成xx.ravel()和yy.ravel()后,在得到z.reshape(xx.shape)就成功了。。。。。。。。成功了。
等高线的画法我就不详细说了,这里只说说思想。
下面是代码:
x = np.linspace(-.5, 1.5, 250) # x坐标
y = np.linspace(-.5, 1.5, 250) # y坐标
xx, yy = np.meshgrid(x, y) # 生成网格数据
# 生成高维特征数据并求出z
z = feature_mapping(xx.ravel(), yy.ravel(), 6)@final_theta
# 保持维度一致
z = z.reshape(xx.shape)
# 画图
plt.contour(xx, yy, z, 0)