一、逻辑回归概述

1.逻辑回归(Logistic Regression)也称作 Logistic 回归分析,是一种广义的线性回归分析模型,属于机器学习中的监督学习。它实际上主要是用来解决二分类问题。通过给定的  组数据(训练集)来训练模型,并在训练结束后对给定的一组或多组数据(测试集)进行分类,其中每一组数据都是由  个指标构成。

逻辑回归 = 线性回归 + S i g m o i d SigmoidSigmoid函数(分类函数)

2.损失函数
为求出好的逻辑回归,引出损失函数 :

①损失函数是体现“预测值”和“真实值”,相似程度的函数

②损失函数越小,模型越好

逻辑回归的损失,称之为对数似然损失,公式如下:

    if y=1

  if y=0 

其中y为真实值,为预测值

无论何时,我们都希望损失函数值,越小越好

分情况讨论,对应的损失函数值:

当y=1时,我们希望值越大越好;
当y=0时,我们希望值越小越好;

综合完整损失函数

3.优点与缺点
优点:简单而且容易实现。逻辑回归的模型相对简单,只需要对输入特征进行线性组合,然后通过S i g m o i d SigmoidSigmoid函数进行分类预测。
计算效率高。逻辑回归的计算量相对较小,可以处理大规模的数据集。
可解释性强。逻辑回归的结果可以解释为某个事件发生的概率,比较直观易懂。
可以在线学习。逻辑回归可以通过梯度下降算法进行在线学习,适用于增量学习和实时预测。
缺点:对特征的依赖性强。逻辑回归对特征之间的依赖性较为敏感,如果特征之间存在较强的相关性,会导致模型效果较差。
对异常值较为敏感。逻辑回归对异常值较为敏感,可能会影响模型的预测结果。
需要大量的特征工程。为了提高逻辑回归的性能,通常需要进行大量的特征工程,包括特征选择、特征变换等。
无法处理非线性问题。逻辑回归是一种线性模型,无法处理非线性问题,需要通过添加多项式特征或者引入核函数来解决非线性问题

二、代码实现

1.数据加载函数 loadDataSet
def loadDataSet():
    data = []
    label = []
    fr = open(filename)
    for line in fr.readlines():
        lineArray = line.strip().split()
        data.append([1.0, float(lineArray[0]), float(lineArray[1])])
        label.append(int(lineArray[2]))
    return data, label

这个函数从文件中读取数据和标签。每行数据被分割成三个部分:前两个是特征值,第三个是标签(类别)。特征值被转换为浮点数,标签被转换为整数。每个数据点还添加了一个额外的特征值1,用于计算截

2.Sigmoid函数 sigmoid
def sigmoid(X):
    return 1.0 / (1 + exp(-X))

激活函数,用于将任何实数映射到(0,1)区间 

3.学习率 alpha
alpha = 0.001

学习率是梯度下降算法中的一个超参数,控制着权重更新的步长。

4.梯度计算函数 gradient
def gradient(weights, data, label):
    dataMatrix = mat(data)
    classLabels = mat(label).transpose()
    h = sigmoid(dataMatrix * weights)
    error = (classLabels - h)
    q = -dataMatrix.transpose() * error
    return q

这个函数计算了损失函数的梯度。它首先将数据和标签转换为矩阵形式,然后计算预测值h,接着计算误差error,最后计算梯度q。

5.梯度下降函数 gradient_Accent
def gradient_Accent(data, label):
    m, n = shape(data)
    weights = ones((n, 1))
    q = gradient(weights, data, label)
    while not all(absolute(q) <= 2e-5):
        weights = weights - alpha * q
        q = gradient(weights, data, label)
    return weights

这个函数使用梯度下降法来更新权重。它初始化权重为1,然后在一个循环中不断更新权重,直到梯度的绝对值小于一个预设的阈值(这里设为2e-5)。

6.绘制决策边界函数 plotBestFit
def plotBestFit(weights):  # 定义一个函数,用于画出最佳拟合线
    import matplotlib.pyplot as plt  # 导入matplotlib.pyplot,用于绘图
    dataMat, labelMat = loadDataSet()  # 加载数据集
    dataArr = array(dataMat)  # 将数据集转换为NumPy数组
    n = shape(dataArr)[0]  # 获取数据集中的样本数量
    # 初始化两个空列表,用于存储两类数据的坐标
    xcord1 = [];
    ycord1 = []
    xcord2 = [];
    ycord2 = []
    # 遍历数据集中的每个样本
    for i in range(n):
        # 根据标签将样本分为两类
        if int(labelMat[i]) == 1:
            xcord1.append(dataArr[i, 1])  # 如果是第一类,添加x坐标
            ycord1.append(dataArr[i, 2])  # 如果是第一类,添加y坐标
        else:
            xcord2.append(dataArr[i, 1])  # 如果是第二类,添加x坐标
            ycord2.append(dataArr[i, 2])  # 如果是第二类,添加y坐标
    fig = plt.figure()  # 创建一个新的图表
    ax = fig.add_subplot(111)  # 在图表中添加一个子图
    # 绘制两类样本的散点图
    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')  # 第一类样本,红色,形状为正方形
    ax.scatter(xcord2, ycord2, s=30, c='green')  # 第二类样本,绿色
    # 创建一个x的数组,用于画出最佳拟合线
    x = arange(-3.0, 3.0, 0.1)
    # 使用逻辑回归模型的权重计算最佳拟合线的y值
    y = (-weights[0] - weights[1] * x) / weights[2]
    # 画出最佳拟合线
    ax.plot(x, y)
    plt.xlabel('X1')  # 设置x轴标签
    plt.ylabel('X2')  # 设置y轴标签
    plt.show()  # 显示图表

 

这个函数用于绘制数据点和决策边界。它根据权重计算出决策边界,并将数据点根据类别用不同的颜色和标记绘制出来。

7.主函数 main
def main():
    dataMat, labelMat = loadDataSet()
    weights = gradient_Accent(dataMat, labelMat).getA()
    plotBestFit(weights)

首先加载数据,然后使用梯度下降法找到最佳权重,并绘制出决策边界

8.运行主函数
if __name__ == '__main__':
    main()

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐