逻辑回归是一种用于解决二分类问题的机器学习算法。它的目标是根据输入数据预测输出结果的概率,通常用于分类问题中。
逻辑回归的基本思想是将输入数据通过一个线性模型,然后将线性模型的输出值通过一个sigmoid函数映射到0到1的范围内,表示为预测结果的概率值。具体来说,假设输入数据为
x xx,模型参数为 w w w和 b b b,则其输出结果可以表示为:
y ^ = σ ( w T x + b ) \hat{y} = \sigma(w^Tx + b) y^=σ(wTx+b)
其中, σ ( ⋅ ) \sigma(\cdot) σ(⋅)表示sigmoid函数,定义为:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+e−z1
sigmoid函数的输出值在0到1的范围内,可以被解释为预测结果为正例的概率。
在训练逻辑回归模型时,通常使用最大似然估计法(Maximum Likelihood Estimation,MLE)来估计模型参数 w w w和 b b b
,使得模型的预测结果与真实标签之间的差异最小化。具体来说,MLE的目标是最大化所有训练样本上的似然函数:
L ( w , b ) = ∏ i = 1 n P ( y i ∣ x i ; w , b ) L(w,b) = \prod_{i=1}^n
P(y_i|x_i;w,b)L(w,b)=i=1∏nP(yi∣xi;w,b)
其中, P ( y i ∣ x i ; w , b ) P(y_i|x_i;w,b) P(yi∣xi;w,b)表示在给定输入 x i x_i xi
的情况下,预测结果为 y i y_i yi的概率。由于这里的输出结果 y i y_i yi只有两个取值,因此可以将 P ( y i ∣ x i ; w ,
b ) P(y_i|x_i;w,b)P(yi∣xi;w,b)表示为:
P ( y i ∣ x i ; w , b ) = y ^ i y i ( 1 − y ^ i ) 1 − y i P(y_i|x_i;w,b) =
\hat{y}_i^{y_i}(1-\hat{y}_i)^{1-y_i}P(yi∣xi;w,b)=y^iyi(1−y^i)1−yi
其中, y ^ i \hat{y}_i y^i表示模型对 x i x_i xi的预测结果。
最终,MLE的目标可以转化为最小化负对数似然:
J ( w , b ) = − 1 n ∑ i = 1 n [ y i log ( y ^ i ) + ( 1 − y i ) 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=1∑n[yilog(y^i)+(1−yi)log(1−y^i)]
通过梯度下降等优化算法,可以求解出最优的模型参数 w w w和 b b b,从而得到一个可以用于分类的模型。
import numpy as np def 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) # 1
labels= 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.05
for e in range(epoch): p = X @ k + b pre = sigmoid(p) loss = -np.sum(labels * np
.log(pre) + (1-labels) * np.log(1-pre)) G = pre - labels delta_k = X.T @ G
delta_b= np.sum(G) k = k - lr * delta_k b = b - lr * delta_b print(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函数作为激活函数,用于将模型的输出转换为概率值。在训练过程中,我们使用交叉熵损失函数作为目标函数,用于衡量模型预测结果与真实标签之间的差异。
另外,由于数据集比较小,代码中没有进行数据集的划分,而是直接将所有数据用于训练。在实际应用中,应该将数据集划分为训练集和测试集,以便更好地评估模型的性能。