机器学习——Logistic回归

本文介绍了线性模型的基本形式,重点讲解了线性回归和Logistic回归的原理、特点以及如何通过Sigmoid函数和梯度上升算法实现。通过实例展示了如何生成数据、训练模型并可视化Logistic回归的决策边界。
摘要由CSDN通过智能技术生成

一.线性模型与回归

线性模型是机器学习中常用的一类模型,其一般形式为:

f(x) = w1x1 + w2x2 + … + wdxd + b

其中,x=(x1, x2, ..., xd) 是由d维属性描述的样本,w=(w1, w2, ..., wd) 是待求解的系数,b 是截距。

给定数据集 D={(x1, y1), (x2, y2), ..., (xm, ym)},其中 xi=(xi1, xi2, ..., xid),yi∈R,线性回归的目标是学习一个线性模型,使得 f(xi)≈yi。

二.Logistic回归

 Logistic回归是一种用于解决二分类问题的统计学习方法。尽管其名字中含有"回归"一词,但实际上,Logistic回归是一种分类算法,用于预测样本属于两个类别中的哪一个。

 算法原理:

Logistic回归采用了一种称为Sigmoid函数的特殊函数来实现分类。Sigmoid函数的数学表达式为:

σ(z)=1/1+e^−z

其中,z 是输入的线性组合(特征的加权和与截距的和)。Sigmoid函数的输出范围在0到1之间,可以被解释为样本属于正类别的概率。

Logistic回归的特点和优势:

  1. 可解释性强: Logistic回归模型得到的系数可以解释为特征对分类的贡献程度,因此具有较好的可解释性。

  2. 计算代价低: 训练Logistic回归模型的计算代价相对较低,尤其适用于大规模数据集。

  3. 概率输出: 输出结果是样本属于正类别的概率,方便进行阈值的调整,同时对不确定性的问题有良好处理。

  4. 抗噪声能力强: 对于一些噪声数据,Logistic回归能够产生较为鲁棒的分类结果。

三.代码

sigmoid函数:

# sigmoid函数
def sigmoid(inX):
    return 1.0 / (1 + exp(-inX))

 梯度上升算法:

def gradAscent(dataMatIn, classLabels):
    dataMatrix = np.mat(dataMatIn)
    labelMat = np.mat(classLabels).transpose()
    m, n = np.shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    weights = np.ones((n, 1))
    for k in range(maxCycles):
        h = sigmoid(dataMatrix * weights)
        error = (labelMat - h)
        weights = weights + alpha * dataMatrix.transpose() * error
    return weights

分类函数:

def classifyVector(inX, weights):
    prob = sigmoid(sum(inX * weights))
    if prob > 0.5:
        return 1.0
    else:
        return 0.0
def generate_data():
    np.random.seed(42)
    num_points = 100
    # 生成两个正态分布的数据集,分别代表两个类别
    class1 = np.random.normal(5, 1, (num_points, 2))
    class2 = np.random.normal(10, 1, (num_points, 2))
    data = np.vstack((class1, class2))
    labels = np.hstack((np.zeros(num_points), np.ones(num_points)))
    return data, labels

def train_logistic_regression(data, labels):
    weights = gradAscent(data, labels)
    return weights

def plot_logistic_regression(data, labels, weights):
    plt.scatter(data[:, 0], data[:, 1], c=labels, cmap=plt.cm.Spectral)
    x_min, x_max = plt.xlim()
    y_min, y_max = plt.ylim()
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
    Z = sigmoid(np.c_[xx.ravel(), yy.ravel()] @ weights)
    Z = Z.reshape(xx.shape)
    plt.contour(xx, yy, Z, levels=[0.5], cmap="RdYlBu", vmin=0, vmax=1)
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.title('Logistic Regression Decision Boundary')
    plt.show()

def main():
    data, labels = generate_data()

    weights = train_logistic_regression(data, labels)
    
    plot_logistic_regression(data, labels, weights)

if __name__ == "__main__":
    main()
  1. generate_data: 生成两个类别的模拟数据集,每个类别有100个样本,特征维度为2,分别采用正态分布生成。

  2. train_logistic_regression: 使用梯度上升算法训练逻辑回归模型,输入数据和标签,返回训练得到的模型参数(权重)。

  3. plot_logistic_regression: 可视化逻辑回归的结果,绘制散点图表示数据分布,绘制决策边界(等概率线)来展示模型的分类效果。

  4. main: 主函数,调用generate_data生成数据,使用train_logistic_regression训练模型,最后通过plot_logistic_regression可视化模型分类结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值