使用matplotlib在python中绘制曲线决策边界

Posted

技术标签:

【中文标题】使用matplotlib在python中绘制曲线决策边界【英文标题】:plotting curve decision boundary in python using matplotlib 【发布时间】:2015-07-13 18:32:49 【问题描述】:

我是使用 python 进行机器学习的新手。我已经设法使用 matplotlib 为逻辑回归绘制了直线决策边界。但是,我在绘制曲线以了解使用某些样本数据集过度拟合的情况时遇到了一些困难。

我正在尝试使用正则化构建逻辑回归模型,并使用正则化来控制我的数据集的过度拟合。

我知道 sklearn 库,但我更喜欢单独编写代码

我正在处理的测试数据样本如下:

x=np.matrix('2,300;4,600;7,300;5,500;5,400;6,400;3,400;4,500;1,200;3,400;7,700;3,550;2.5,650')
y=np.matrix('0;1;1;1;0;1;0;0;0;0;1;1;0') 

我期望的决策边界如下图所示:

任何帮助将不胜感激。

我可以使用下面的代码绘制一条直线决策边界:

# plot of x 2D
plt.figure()
pos=np.where(y==1)
neg=np.where(y==0)

plt.plot(X[pos[0],0], X[pos[0],1], 'ro')
plt.plot(X[neg[0],0], X[neg[0],1], 'bo')
plt.xlim([min(X[:,0]),max(X[:,0])])
plt.ylim([min(X[:,1]),max(X[:,1])])
plt.show()

# plot of the decision boundary
plt.figure()
pos=np.where(y==1)
neg=np.where(y==0)

plt.plot(x[pos[0],1], x[pos[0],2], 'ro')
plt.plot(x[neg[0],1], x[neg[0],2], 'bo')
plt.xlim([x[:, 1].min()-2 , x[:, 1].max()+2])
plt.ylim([x[:, 2].min()-2 , x[:, 2].max()+2])


plot_x = [min(x[:,1])-2,  max(x[:,1])+2]   # Takes a lerger decision line

plot_y = (-1/theta_NM[2])*(theta_NM[1]*plot_x +theta_NM[0])
plt.plot(plot_x, plot_y)

我的决策边界是这样的:

在理想情况下,上述决策边界很好,但我想绘制一个曲线决策边界,它非常适合我的训练数据,但会过度拟合我的测试数据。类似于第一个情节中显示的内容

【问题讨论】:

您的问题/问题是什么?你试过什么? 您好 julien,我正在尝试构建曲线决策边界,我尝试使用 matplotlib 绘制直线。但我不知道如何在 matplotlib 中绘制曲线。我正在尝试曲线的多项式特征。我已经对我的问题进行了一些更新。请看看..谢谢:) 你不能简单地使用蓝点的最大包络和红点的最小包络之间的平均值吗? (虽然不确定如何处理原始图中缺少的红点(x 5)) 其实它们并没有丢失,拉长图形时可以看到它们。我正在寻找一些等高线图。我可以使用 octave 绘制相同的图,因为我是 python 新手,我不知道如何继续 不确定“它们没有丢失”是什么意思:除非 x 和 y 不是您的完整数据集,否则 y = 1 的横坐标低于 3 的点没有任何意义。 【参考方案1】:

这可以通过对参数空间进行网格化并将每个网格点设置为最近点的值来完成。然后在这个网格上运行等高线图。

但是有许多变化,例如将其设置为距离加权平均值;或平滑最终轮廓;等等

这是一个寻找初始轮廓的例子:

import numpy as np
import matplotlib.pyplot as plt

# get the data as numpy arrays
xys = np.array(np.matrix('2,300;4,600;7,300;5,500;5,400;6,400;3,400;4,500;1,200;3,400;7,700;3,550;2.5,650'))
vals = np.array(np.matrix('0;1;1;1;0;1;0;0;0;0;1;1;0'))[:,0]
N = len(vals)

# some basic spatial stuff
xs = np.linspace(min(xys[:,0])-2, max(xys[:,0])+1, 10)
ys = np.linspace(min(xys[:,1])-100, max(xys[:,1])+100, 10)
xr = max(xys[:,0]) - min(xys[:,0])  # ranges so distances can weight x and y equally
yr = max(xys[:,1]) - min(xys[:,1])
X, Y = np.meshgrid(xs, ys)    # meshgrid for contour and distance calcs

# set each gridpoint to the value of the closest data point:
Z = np.zeros((len(xs), len(ys), N))
for n in range(N):
    Z[:,:,n] = ((X-xys[n,0])/xr)**2 + ((Y-xys[n,1])/yr)**2  # stack arrays of distances to each points  
z = np.argmin(Z, axis=2)   # which data point is the closest to each grid point
v = vals[z]                # set the grid value to the data point value

# do the contour plot (use only the level 0.5 since values are 0 and 1)
plt.contour(X, Y, v, cmap=plt.cm.gray, levels=[.5])  # contour the data point values

# now plot the data points
pos=np.where(vals==1)
neg=np.where(vals==0)

plt.plot(xys[pos,0], xys[pos,1], 'ro')
plt.plot(xys[neg,0], xys[neg,1], 'bo')

plt.show()

【讨论】:

以上是关于使用matplotlib在python中绘制曲线决策边界的主要内容,如果未能解决你的问题,请参考以下文章

在 matplotlib 图中绘制平滑曲线

pyqt中使用matplotlib绘制动态曲线 – pythonic

python使用matplotlib绘制一条正弦曲线(plot函数可视化sine plot)

绘制/计算指数曲线的问题(python、matplotlib、pandas)

用Matplotlib绘制渐变的彩色曲线

用Matplotlib绘制渐变的彩色曲线