更新于 2026年7月11日

逻辑回归#

逻辑回归(Logistic Regression) 是一种经典的监督式机器学习算法,主要用于解决分类问题(预测某个事件发生的概率,如是/否、患病/健康)。尽管名称带有“回归”,它本质上是一种分类算法。

示例代码#

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression

def make_data():
    num_points = 200
    centers = [[1, 1], [2, 2]]  # 指定中心
    x, y = make_blobs(n_samples=num_points, centers=centers,
                      cluster_std=0.2, random_state=np.random.seed(10))
    index_pos, index_neg = (y == 1), (y == 0)
    plt.rcParams['ytick.direction'] = 'in'  # 刻度向内
    plt.rcParams['xtick.direction'] = 'in'  # 刻度向内
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
    x_pos, x_neg = x[index_pos], x[index_neg]
    plt.scatter(x_pos[:, 0], x_pos[:, 1], marker='o', label='正样本', s=50)
    plt.scatter(x_neg[:, 0], x_neg[:, 1], marker='s', label='负样本', s=50)
    plt.legend(fontsize=15)
    plt.tick_params(axis='x', labelsize=15)  # x轴刻度数字大小
    plt.tick_params(axis='y', labelsize=15)  # y轴刻度数字大小
    plt.tight_layout()
    plt.show()
    return x, y

def decision_boundary(x, y):
    ###########  模型求解并预测
    model = LogisticRegression()
    model.fit(x, y)
    pred = model.predict([[1, 0.5], [3, 1.5]])
    print("样本点(1,0.5)所属的类标为{}\n"
          "样本点(3,1.5)所属的类标为{}".format(pred[0], pred[1]))

    ###########  绘制决策面
    x_min, x_max = x[:, 0].min() - .5, x[:, 0].max() + .5
    y_min, y_max = x[:, 1].min() - .5, x[:, 1].max() + .5
    plt.rcParams['ytick.direction'] = 'in'  # 刻度向内
    plt.rcParams['xtick.direction'] = 'in'  # 刻度向内
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
    h = .02  # step size in the mesh
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    x_new = np.hstack([xx.reshape(-1, 1), yy.reshape(-1, 1)])
    Z = model.predict(x_new)
    Z = Z.reshape(xx.shape)
    plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired, shading='auto')

    ###########  绘制原始样本点
    index_pos, index_neg = (y == 1), (y == 0)
    x_pos, x_neg = x[index_pos], x[index_neg]
    plt.scatter(x_pos[:, 0], x_pos[:, 1], marker='o', label='正样本', s=50)
    plt.scatter(x_neg[:, 0], x_neg[:, 1], marker='s', label='负样本', s=50)
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
    plt.legend(fontsize=15)
    plt.tick_params(axis='x', labelsize=15)  # x轴刻度数字大小
    plt.tick_params(axis='y', labelsize=15)  # y轴刻度数字大小
    plt.tight_layout()
    plt.show()

if __name__ == '__main__':
    x, y = make_data()
    decision_boundary(x, y)

运行结果#

样本点(1,0.5)所属的类标为0
样本点(3,1.5)所属的类标为1
逻辑回归运行结果图
逻辑回归运行结果图
逻辑回归运行结果图
逻辑回归运行结果图
阅读 --

3.1 模型的建立与求解

在本节中,我们首先通过一个例子引入了什么是分类,然后介绍了为什么不能用线性回归模型进行建模的原因。其次,通过对线性回归的改进得到逻辑回归模型,并直接地给出了逻辑回归模型的目标函数。最后通过开源的sklearn框架搭建了一个简单的逻辑回归模型 …