逻辑回归是一种用于解决二分类问题的机器学习算法。它的目标是根据输入数据预测输出结果的概率,通常用于分类问题中。
逻辑回归的基本思想是将输入数据通过一个线性模型,然后将线性模型的输出值通过一个sigmoid函数映射到0到1的范围内,表示为预测结果的概率值。具体来说,假设输入数据为 x x x,模型参数为 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函数作为激活函数,用于将模型的输出转换为概率值。在训练过程中,我们使用交叉熵损失函数作为目标函数,用于衡量模型预测结果与真实标签之间的差异。
另外,由于数据集比较小,代码中没有进行数据集的划分,而是直接将所有数据用于训练。在实际应用中,应该将数据集划分为训练集和测试集,以便更好地评估模型的性能。