在散点图上绘制隐式函数(逻辑回归中的决策边界)

Posted

技术标签:

【中文标题】在散点图上绘制隐式函数(逻辑回归中的决策边界)【英文标题】:Plotting an implicit function on top of scatter plots (decision boundary in logistic regression) 【发布时间】:2020-10-27 04:57:24 【问题描述】:

我正在做一个逻辑回归,以在 Python 中将数据分成两部分。有 28 个特征是从 2 个原始特征派生出来的,然后这些特征被用来推导它们之间的 6 次方(例如 x_0^1x_1^5、x_0^6 等)。问题是,与边界是一条线时不同,我找不到如何在散点图上绘制非线性边界。

我尝试使用 scipy.optimize 求解每个 x 处的边界方程,但结果非常不理想:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize
from functools import partial

plt.scatter(data['X1'][data['Y'] == 0], data['X2'][data['Y'] == 0], c='r', marker='o')  # data points where Y==0
plt.scatter(data['X1'][data['Y'] == 1], data['X2'][data['Y'] == 1], c='b', marker='+')  # data points where Y==1
def bnd_func(x, y):  # boundary function using the 'th' parameter vector
    return th[0] + th[1]*y + th[2]*y**2 + th[3]*y**3 + th[4]*y**4 + th[5]*y**5 + th[6]*y**6 + th[7]*x + th[8]*x*y + th[9]*x*y**2 + th[10]*x*y**3 + th[11]*x*y**4 + th[12]*x*y**5 + th[13]*x**2 + th[14]*x**2*y + th[15]*x**2*y**2 + th[16]*x**2*y**3 + th[17]*x**2*y**4 + th[18]*x**3 + th[19]*x**3*y + th[20]*x**3*y**2 + th[21]*x**3*y**3 + th[22]*x**4 + th[23]*x**4*y + th[24]*x**4*y**2 + th[25]*x**5 + th[26]*x**5*y + th[27]*x**6
xs = np.linspace(-1, 1.25, 200)
xa = []; ya= [];
for x in xs:
    try:
        y = scipy.optimize.newton(partial(bnd_func, x), 0, maxiter=10000, tol=10**(-5))
    except ValueError:
        pass
    else:
        xa.append(x)
        ya.append(y)
plt.plot(xa, ya)
plt.show()

边界缺少顶部;也许我可以更改初始值,但这确实是一个不雅的解决方案。我也尝试过使用 sympy,但我无法将散点图重叠在它上面。有没有办法实现这一目标?如有必要,我不介意使用其他软件包。

另一个问题是,如果我使用 sklearn.linear_model 来代替,如何实现?我知道如何检索系数,但我仍然不确定用原始散点图绘制边界。

【问题讨论】:

【参考方案1】:

我通过使用等高线图解决了这个问题:

# Fitting
plt.scatter(data['X1'][data['Y'] == 0], data['X2'][data['Y'] == 0], c='r', marker='o')
plt.scatter(data['X1'][data['Y'] == 1], data['X2'][data['Y'] == 1], c='b', marker='+')
plt.axis('scaled')
def bnd_func(x, y):
    return th[0] + th[1]*y + th[2]*y**2 + th[3]*y**3 + th[4]*y**4 + th[5]*y**5 + th[6]*y**6 + th[7]*x + th[8]*x*y + th[9]*x*y**2 + th[10]*x*y**3 + th[11]*x*y**4 + th[12]*x*y**5 + th[13]*x**2 + th[14]*x**2*y + th[15]*x**2*y**2 + th[16]*x**2*y**3 + th[17]*x**2*y**4 + th[18]*x**3 + th[19]*x**3*y + th[20]*x**3*y**2 + th[21]*x**3*y**3 + th[22]*x**4 + th[23]*x**4*y + th[24]*x**4*y**2 + th[25]*x**5 + th[26]*x**5*y + th[27]*x**6
data_min = data.min().values
data_max = data.max().values
xax = np.arange(data_min[0], data_max[0], 0.05)
yax = np.arange(data_min[1], data_max[1], 0.05)
x_grid, y_grid = np.meshgrid(xax, yax)
zax = bnd_func(x_grid, y_grid)
z_grid = zax.reshape(x_grid.shape)
plt.contour(x_grid, y_grid, z_grid, levels = [0])
plt.show()

【讨论】:

以上是关于在散点图上绘制隐式函数(逻辑回归中的决策边界)的主要内容,如果未能解决你的问题,请参考以下文章

在散点图上叠加线函数 - seaborn

如何在 Python 中绘制逻辑回归的决策边界?

如何在散点图上拖放

R语言ggplot2可视化:ggplot2可视化分组散点图并使用geom_smooth函数在散点图图中为不同的散点簇添加对应的回归曲线

杂乱的散点图回归线:Python

R语言可视化散点图(scatter plot)并在散点图中叠加回归曲线叠加lowess拟合曲线(linear and lowess fit lines)使用plotlineabline函数