【问题标题】:How do I plot the decision boundary of a regression using matplotlib?如何使用 matplotlib 绘制回归的决策边界?
【发布时间】:2013-12-01 11:56:17
【问题描述】:

如何将逻辑回归结果的计数图添加到我的散点图中?我想要彩色 0/1 区域,它描绘了分类器的决策边界。

import pandas as pd
import numpy as np
import pylab as pl
import statsmodels.api as sm

# Build X, Y from file
f = open('ex2data2.txt')
lines = f.readlines()
x1 = []
x2 = []
y = []
for line in lines:
    line = line.replace("\n", "")
    vals = line.split(",")
    x1.append(float(vals[0]))
    x2.append(float(vals[1]))
    y.append(int(vals[2]))

x1 = np.array(x1)
x2 = np.array(x2)
y = np.array(y)

x = np.vstack([x1, x2]).T

# Scatter plot 0/1s
pos_mask = y == 1
neg_mask = y == 0
pos_x1 = x1[pos_mask]
neg_x1 = x1[neg_mask]
pos_x2 = x2[pos_mask]
neg_x2 = x2[neg_mask]
pl.clf()
pl.scatter(pos_x1, pos_x2, c='r')
pl.scatter(neg_x1, neg_x2, c='g')

# Run logistic regression
logit = sm.Logit(y, x)
result = logit.fit()
result.params
result.predict([1.0, 1.0])

# Now I want to add a countour for 0/1 regression results to the scatter plot.

【问题讨论】:

    标签: python matplotlib contour scatter-plot logistic-regression


    【解决方案1】:

    我会尝试回答,但对于我的回答,您必须了解一些假设,这些假设可能适用于您的代码,也可能不适用于您的代码:

    我的进口:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.colors import ListedColormap
    

    X 包含您的功能,如下所示:

    print type(X)
    <type 'numpy.ndarray'>
    

    如图所示是102,2:

    print X
    [[-13.15490196 -23.        ]
    [-22.95490196 -25.        ]
    [-12.75490196  -8.        ]
    [  0.14509804  -6.        ]
    .
    .
    .
    

    ytrain 包含基本事实,在这种情况下它是布尔值,但你可以做 0/1 一样。

    print type(ytrain)
    <type 'numpy.ndarray'>
    

    现在是 51,

    print (train)
    [False False False False  True  True  True  True  True  True False  True
    False  True  True  True False False False  True  True  True  True  True
    False False False False  True  True  True  True  True  True False  True
    False  True  True  True False False False False False  True  True  True
    False  True False]
    

    最后clf 包含您的模型,在我的情况下是拟合模型 我也在使用来自 scikit learn 的 LogisticRegression,这依赖于我的 clf.predict_proba 提供构建标签和轮廓所需的信息。我不熟悉 您正在使用的确切软件包,但请记住这一点。

    # evenly sampled points
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, 50),
                         np.linspace(y_min, y_max, 50))
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    
    #plot background colors
    ax = plt.gca()
    Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
    Z = Z.reshape(xx.shape)
    cs = ax.contourf(xx, yy, Z, cmap='RdBu', alpha=.5)
    cs2 = ax.contour(xx, yy, Z, cmap='RdBu', alpha=.5)
    plt.clabel(cs2, fmt = '%2.1f', colors = 'k', fontsize=14)
    
    # Plot the points
    ax.plot(Xtrain[ytrain == 0, 0], Xtrain[ytrain == 0, 1], 'ro', label='Class 1')
    ax.plot(Xtrain[ytrain == 1, 0], Xtrain[ytrain == 1, 1], 'bo', label='Class 2')
    
    # make legend
    plt.legend(loc='upper left', scatterpoints=1, numpoints=1)
    

    您的结果将如下所示:

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 2015-03-31
      • 2014-11-27
      • 2019-04-22
      • 2020-08-31
      • 2017-07-30
      • 2020-03-28
      相关资源
      最近更新 更多