> 文章列表 > 逻辑回归算法

逻辑回归算法

逻辑回归算法

逻辑回归是一种用于解决二分类问题的机器学习算法。它的目标是根据输入数据预测输出结果的概率,通常用于分类问题中。

逻辑回归的基本思想是将输入数据通过一个线性模型,然后将线性模型的输出值通过一个sigmoid函数映射到0到1的范围内,表示为预测结果的概率值。具体来说,假设输入数据为xxx,模型参数为wwwbbb,则其输出结果可以表示为:

y^=σ(wTx+b)\\hat{y} = \\sigma(w^Tx + b) y^=σ(wTx+b)

其中,σ(⋅)\\sigma(\\cdot)σ()表示sigmoid函数,定义为:

σ(z)=11+e−z\\sigma(z) = \\frac{1}{1+e^{-z}} σ(z)=1+ez1

sigmoid函数的输出值在0到1的范围内,可以被解释为预测结果为正例的概率。

在训练逻辑回归模型时,通常使用最大似然估计法(Maximum Likelihood Estimation,MLE)来估计模型参数wwwbbb,使得模型的预测结果与真实标签之间的差异最小化。具体来说,MLE的目标是最大化所有训练样本上的似然函数:

L(w,b)=∏i=1nP(yi∣xi;w,b)L(w,b) = \\prod_{i=1}^n P(y_i|x_i;w,b) L(w,b)=i=1nP(yixi;w,b)

其中,P(yi∣xi;w,b)P(y_i|x_i;w,b)P(yixi;w,b)表示在给定输入xix_ixi的情况下,预测结果为yiy_iyi的概率。由于这里的输出结果yiy_iyi只有两个取值,因此可以将P(yi∣xi;w,b)P(y_i|x_i;w,b)P(yixi;w,b)表示为:

P(yi∣xi;w,b)=y^iyi(1−y^i)1−yiP(y_i|x_i;w,b) = \\hat{y}_i^{y_i}(1-\\hat{y}_i)^{1-y_i} P(yixi;w,b)=y^iyi(1y^i)1yi

其中,y^i\\hat{y}_iy^i表示模型对xix_ixi的预测结果。

最终,MLE的目标可以转化为最小化负对数似然:

J(w,b)=−1n∑i=1n[yilog⁡(y^i)+(1−yi)log⁡(1−y^i)]J(w,b) = -\\frac{1}{n}\\sum_{i=1}^n [y_i\\log(\\hat{y}_i) + (1-y_i)\\log(1-\\hat{y}_i)] J(w,b)=n1i=1n[yilog(y^i)+(1yi)log(1y^i)]

通过梯度下降等优化算法,可以求解出最优的模型参数wwwbbb,从而得到一个可以用于分类的模型。

import numpy as npdef sigmoid(x):
return 1/(1+np.exp(-x))if name == "main":
# -------------毛发长,腿长
dogs = np.array([[8.9,12],[9,11],[10,13],[9.9,11.2],[12.2,10.1],[9.8,13],[8.8,11.2]],dtype = np.float32) # 0
cats = np.array([[3,4],[5,6],[3.5,5.5],[4.5,5.1],[3.4,4.1],[4.1,5.2],[4.4,4.4]],dtype = np.float32) # 1labels = np.array([0]*7 + [1]* 7,dtype = np.int32).reshape(-1,1)X = np.vstack((dogs,cats))k = np.random.normal(0,1,size=(2,1))
b = 0
epoch = 1000
lr = 0.05for e in range(epoch):p = X @ k + bpre = sigmoid(p)loss = -np.sum(labels * np.log(pre) + (1-labels) * np.log(1-pre))G = pre - labelsdelta_k = X.T @ Gdelta_b = np.sum(G)k = k - lr * delta_kb = b - lr * delta_bprint(loss)while True:f1 = float(input('请输入毛发长:'))f2 = float(input("请输入腿长:"))test_x = np.array([f1,f2]).reshape(1,2)p = sigmoid(test_x @ k + b )if p >0.5:print("类别: 猫")else:print("类别: 狗")

上述代码实现了一个简单的二分类模型,使用逻辑回归算法对猫和狗进行分类。具体来说,代码中使用了以下步骤:

构造数据集,包括狗的毛发长和腿长以及猫的毛发长和腿长,并将它们拼接成一个矩阵X。同时,根据数据集中的狗和猫的数量,构造标签向量labels,其中狗的标签为0,猫的标签为1。

初始化模型参数,包括参数向量k和截距b。这里使用正态分布随机初始化参数。

使用逻辑回归算法训练模型。在每个训练轮次中,首先计算模型对所有样本的预测值pre,然后使用交叉熵损失函数计算损失值。接着,计算损失函数对参数向量k和截距b的梯度,并使用梯度下降算法更新模型参数。

在训练完成后,使用模型对新数据进行预测。用户可以输入一条新数据,包括毛发长和腿长,模型将返回该数据属于猫还是狗。

需要注意的是,代码中使用了sigmoid函数作为激活函数,用于将模型的输出转换为概率值。在训练过程中,我们使用交叉熵损失函数作为目标函数,用于衡量模型预测结果与真实标签之间的差异。

另外,由于数据集比较小,代码中没有进行数据集的划分,而是直接将所有数据用于训练。在实际应用中,应该将数据集划分为训练集和测试集,以便更好地评估模型的性能。