二元逻辑回归(logistic regression)

目录

一,原理

二,python代码

2.1 数据集的格式

2.2 代码

三,适用条件

一,原理

回归

        假设存在一些数据点,用一条直线或者曲线或折现去拟合这些点就叫做回归。也就是找出平面点上两个轴变量之间的函数关系,或者其他坐标系下的变量间关系。一句话就是:回归就是依靠已有数据点去拟合函数关系。

        常见的回归有:线性回归,非线性回归,局部加权回归……

逻辑回归回归的目标是一个二值结果(0和1),是一种常见的二元分类模型。本质就是线性回归与激活函数sigmoid的结合,与大脑神经元工作方式类似,是入门机器学习的基础。

应用:对于一个具体的实际问题,我们可以得到他既有的一些数据,那么就可以使用逻辑回归对这些数据进行特征处理学习,让计算机去寻找处数据之间的函数关系。当我们得到新的数据,就可以应用计算机得到的函数关系去预测某些数据所产生的结果。

理论来源

数学实现:

        线性回归指的是多个y=ax+b这种的一元函数进行累加,如下面所说的数据综合体。由于需要进行分类,使用sigmoid函数将连续的线性结果人为分为0和1两种状态。

sigmoid函数:

         以0.5为界限。

使用数学来实现神经元处理信息的过程:

前提:最终结果是0和1,表示两种分类结果。w(数据权重)成了模型的参数。

第一步:定义损失函数

第二步:

求解L(w)的某一个w使其函数值最小,那么与实际结果数据就越吻合。

 第三步:

        看这些符号已经头昏眼花。

第四步:程序实现

二,python代码

2.1 数据集的格式

        命名为testset.txt,是一个N×3的形式。-0.017612与14.053064之间是一个tab的距离。

2.2 代码

import numpy as np
import matplotlib.pyplot as plt


# 定义激活函数sigmoid
def sigmoid(z):
    return 1.0 / (1 + np.exp(-z))


# datas NxD
# labs Nx1
# w    Dx1

# 权重更新
def weight_update(datas, labs, w, alpha=0.01):
    z = np.dot(datas, w)  # Nx1,神经元接受的数据综合体,有N个数据
    h = sigmoid(z)  # Nx1,激活函数的值,0-1之间,相对于预测值
    Error = labs - h  # Nx1,预测值与实际值的误差,Y-h
    w = w + alpha * np.dot(datas.T, Error)
    return w


#进行训练,求解参数,非随机梯度下降
def train_LR(datas, labs, n_epoch=2, alpha=0.005):
    N, D = np.shape(datas)# datas NxD
    w = np.ones([D, 1])  # Dx1,给权重赋初始值,都是1
    # 进行n_epoch轮迭代
    for i in range(n_epoch):
        w = weight_update(datas, labs, w, alpha)
        error_rate = test_accuracy(datas, labs, w)#计算误差率
        print("epoch %d error %.3f%%" % (i, error_rate * 100))
    return w


# 随机梯度下降,带batchsize的,可以使更快的找到导数为0的点,而不会在此左右徘徊,alpha也不能取太大,导致在导数为0的点处左右徘徊
def train_LR_batch(datas, labs, batchsize, n_epoch=2, alpha=0.005):
    N, D = np.shape(datas)
    # weight 初始化
    w = np.ones([D, 1])  # Dx1
    N_batch = N // batchsize
    for i in range(n_epoch):
        # 数据打乱
        rand_index = np.random.permutation(N).tolist()
        # 每个batch 更新一下weight
        for j in range(N_batch):
            # alpha = 4.0/(i+j+1) +0.01
            index = rand_index[j * batchsize:(j + 1) * batchsize]
            batch_datas = datas[index]
            batch_labs = labs[index]
            w = weight_update(batch_datas, batch_labs, w, alpha)

        error = test_accuracy(datas, labs, w)
        print("epoch %d  误差率  %.2f%%" % (i, error * 100))
    return w


# 测试精确性,与模型无关,用于提醒展示效果,作用是计算误差率
def test_accuracy(datas, labs, w):
    N, D = np.shape(datas)
    z = np.dot(datas, w)  # Nx1
    h = sigmoid(z)  # Nx1
    lab_det = (h > 0.5).astype(np.float)
    error_rate = np.sum(np.abs(labs - lab_det)) / N
    return error_rate


# 画图,直观地表示出结果
def draw_desion_line(datas, labs, w, name="0.jpg"):
    dic_colors = {0: (.8, 0, 0), 1: (0, .8, 0)}

    # 画数据点
    for i in range(2):
        index = np.where(labs == i)[0]
        sub_datas = datas[index]
        plt.scatter(sub_datas[:, 1], sub_datas[:, 2], s=16., color=dic_colors[i])

    # 画判决线
    min_x = np.min(datas[:, 1])
    max_x = np.max(datas[:, 1])
    w = w[:, 0]
    x = np.arange(min_x, max_x, 0.01)
    y = -(x * w[1] + w[0]) / w[2]
    plt.plot(x, y)

    plt.savefig(name)

#加载数据集进行训练或者加载测试数据对模型进行检验
def load_dataset(file):
    with open(file, "r", encoding="utf-8") as f:
        lines = f.read().splitlines()

    # 取 lab 维度为 N x 1
    labs = [line.split("\t")[-1] for line in lines]
    labs = np.array(labs).astype(np.float32)
    labs = np.expand_dims(labs, axis=-1)  # Nx1

    # 取数据 增加 一维全是1的特征
    datas = [line.split("\t")[:-1] for line in lines]
    datas = np.array(datas).astype(np.float32)
    N, D = np.shape(datas)
    # 增加一个维度
    datas = np.c_[np.ones([N, 1]), datas]
    return datas, labs


if __name__ == "__main__":
    # 加载数据
    file = "1.txt"
    datas, labs = load_dataset(file)

    weights = train_LR_batch(datas, labs,batchsize=2, alpha=0.001, n_epoch=800)
    print('w1是{},w2是{},b是{}'.format(weights[0][0],weights[1][0],weights[2][0]))
    #回归直线就是w1x+w2y+b=0 
    draw_desion_line(datas, labs, weights, name="test_1.jpg")#将结果保存为jpg文件

三,适用条件

        多用于二维平面点集的分类,当数据集维度过大,逻辑回归的效果并不好,无法使交叉熵趋于0。

### 回答1: Logistic回归是一种逻辑回归方法。它是一种特殊的回归方法,用于对于分类问题中的因变量建立预测模型。这种方法基于学习一个由输入变量到二元输出变量的条件概率来构建预测模型,用于对一个新的样本进行分类。它对于分类问题中的因变量建立预测模型非常有效。 ### 回答2: 逻辑回归是一种用于解决二分类问题的监督学习算法。它是一种基于概率统计的分类模型,可以用于预测分类结果。逻辑回归的输出结果是一个0到1之间的概率值,其含义是该样本属于某一类别的概率。 逻辑回归模型的基本假设是数据服从伯努利分布,也就是数据只有两种可能的取值,被称为正类和负类。对于给定的训练数据集,逻辑回归模型的目标是最大化似然函数,即最大化样本属于正类(或负类)的概率。利用最大似然估计方法,我们可以求解出逻辑回归模型的参数。在实际应用中,我们通常使用梯度下降等优化算法来求解模型参数。 逻辑回归模型有多种变体,如L1正则化逻辑回归、L2正则化逻辑回归、多项式逻辑回归等。其中,L1正则化逻辑回归可以实现特征选择,可以削减一些不重要的特征,从而简化模型,提高计算速度和模型的泛化能力。 在机器学习领域,逻辑回归是一个常用的模型。它广泛应用于各种领域,如网络广告点击率预测、信用风险评估、医疗诊断等。逻辑回归模型简单易实现,具有较高的解释性,是一个较为理想的分类算法。 ### 回答3: 逻辑回归Logistic Regression)是一种经典的分类算法,在机器学习和统计学领域中得到广泛的应用。它旨在从已有的数据中构建一个能够预测类别的模型,输出结果为概率值,可以用于二分类或多分类问题的解决。 逻辑回归的基本原理是利用一个特定的函数对输入特征进行线性组合,然后将结果输入到一个Sigmoid函数中进行映射,将结果值压缩到0到1的范围内,表示输入属于某一类别的概率。这个Sigmoid函数可以被看作是一个阀门,控制着数据流向最终输出。它将具有很强预测能力的线性组合函数输出转化为概率输出的过程,将出现在中间层的结果值映射到[0,1]范围内,以表达某个样本属于某个类别的概率。 在训练模型时,逻辑回归使用的是最大似然估计的方法来确定模型的参数。在分类训练数据时,需要对样本经过一系列的处理,例如特征提取、特征转换、数据归一化等步骤。训练数据可以通过梯度下降法、牛顿迭代法等优化方法来确定最佳参数。通过此训练过程,模型可以学习到输入特征与输出概率之间的映射关系。 逻辑回归的优点包括了功能简单、速度快、易于实现和修改等等。它是机器学习中最为基本的分类算法之一,在数据挖掘、信用评估、自然语言处理、广告推荐等领域都有广泛的应用。逻辑回归作为一个二分类算法,常被用于解决分类问题。然而,在实际业务中,如何选择不同的逻辑回归模型及参数,对算法的效果和优化有着重要的影响。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值