python实现梯度下降和逻辑回归

1. 梯度下降

梯度下降法是一种常用的迭代优化算法,用于求解函数的最小值。其基本思想是通过不断的迭代,沿着负梯度方向逐步接近函数的最小值点。

以下是使用python实现梯度下降法的样例代码:

import numpy as np

def gradient_descent(x, y, alpha=0.01, num_iterations=1000):

m = x.shape[0] # 样本数

n = x.shape[1] # 特征数

theta = np.zeros((n, 1)) # 参数初始化

J_history = np.zeros((num_iterations, 1)) # 记录损失函数值

for i in range(num_iterations):

h = np.dot(x, theta) # 计算假设函数

loss = h - y

gradient = np.dot(x.transpose(), loss) / m # 计算梯度

theta = theta - alpha * gradient # 更新参数

J_history[i] = compute_cost(x, y, theta) # 更新损失函数值

return theta, J_history

def compute_cost(x, y, theta):

m = x.shape[0] # 样本数

h = np.dot(x, theta) # 计算假设函数

loss = h - y

J = np.dot(loss.transpose(), loss) / (2 * m) # 计算损失函数

return J

1.1 理论知识

梯度下降法背后的核心理论是导数和梯度的定义。在单变量函数中,导数可以表示函数曲线的斜率,而在多变量函数中,梯度可以表示函数曲面在某点处的斜率。

对于一个无约束的凸函数(每一点的二阶导数都非负),梯度下降算法可以保证收敛到全局最优解。但是,在实际问题中,由于多种原因,梯度下降算法可能会收敛到局部最优解。解决这个问题的方法是使用其他的优化算法,例如Momentum、Adagrad、RMSProp、Adam等,可以在实际问题中选择合适的算法。以下是梯度下降法的流程图:

1.2 核心步骤

梯度下降法的核心步骤如下:

初始化参数向量$\theta$为0。

计算损失函数$J(\theta)$。

计算损失函数的梯度$\nabla J(\theta)$。

使用梯度下降公式更新参数向量$\theta$:

$$\theta_j = \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta)$$

其中$\alpha$控制更新步长,并且需要调节合适的学习率。

1.3 代码解释

上述的样例代码中,首先定义了梯度下降函数gradient_descent,该函数接受样本集合x,样本标签y,学习率alpha,以及迭代次数num_iterations等参数,然后通过for循环迭代的调整参数theta,并记录每次迭代后的损失函数值J_history,最终返回最优化的参数以及所有迭代的损失函数值。

另外,该样例代码中也定义了计算损失函数compute_cost的函数,用于计算给定参数向量theta下的模型误差,通过不断的梯度下降,可以找到最优的参数向量theta,最终生成训练好的模型。

2. 逻辑回归

逻辑回归是一种常用的分类算法,其基本思路是在给定特征$x$的条件下,通过构造适当的假设函数$h_\theta(x)$,来预测样本的标签$y$。

2.1 理论知识

逻辑回归的核心理论是概率论和最大似然估计。在二元分类问题中,假设样本标签是$y \in \{0, 1\}$,则可以使用逻辑函数(Logistic Function)表示样本实例属于正类的概率:

$$

h_\theta(x) = \frac{1}{1 + e^{-\theta^Tx}}

$$

其中,$\theta$是逻辑回归的参数向量,$x$是样本特征。

通过观察该公式我们可以得知,当$\theta^Tx$为正且数值很大时,逻辑函数$\frac{1}{1+e^{-\theta^Tx}}$趋近于1,即样本属于正类的概率很大;反之,当$\theta^Tx$为负且数值很小时,逻辑函数趋近于0,即样本属于正类的概率很小。

逻辑回归的目标是找到一组最优参数$\theta$,使得预测结果$h_\theta(x)$与真实标签$y$之间的差距最小。

2.2 核心步骤

逻辑回归的核心步骤如下:

初始化参数向量$\theta$。

计算损失函数$J(\theta)$。

计算损失函数的梯度$\nabla J(\theta)$。

使用梯度下降公式更新参数向量$\theta$:

$$

\theta_j = \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta)

$$

其中,损失函数$J(\theta)$为逻辑回归的交叉熵损失函数:

$$

J(\theta) = -\frac{1}{m}\sum_{i=1}^{m}\left(y^{(i)}\log(h_\theta(x^{(i)})) + (1-y^{(i)})\log(1-h_\theta(x^{(i)}))\right)

$$

这里$m$表示样本数,$x^{(i)}$表示第$i$个样本的特征向量,$y^{(i)}$表示标签,$h_\theta(x^{(i)})$表示第$i$个样本的预测概率。

2.3 代码解释

以下是使用python实现逻辑回归的样例代码:

import numpy as np

import matplotlib.pyplot as plt

def sigmoid(x):

return 1 / (1 + np.exp(-x))

def compute_cost(x, y, theta):

m = x.shape[0] # 样本数

h = sigmoid(np.dot(x, theta)) # 计算预测值

loss = y * np.log(h) + (1 - y) * np.log(1 - h) # 计算损失

J = -np.sum(loss) / m # 计算平均损失

return J

def gradient_descent(x, y, alpha=0.01, num_iterations=1000):

m = x.shape[0] # 样本数

n = x.shape[1] # 特征数

theta = np.zeros((n, 1)) # 参数初始化

J_history = np.zeros((num_iterations, 1)) # 记录损失函数值

for i in range(num_iterations):

h = sigmoid(np.dot(x, theta)) # 计算预测值

loss = h -y # 计算损失

gradient = np.dot(x.transpose(), loss) / m # 计算梯度

theta = theta - alpha * gradient # 更新参数

J_history[i] = compute_cost(x, y, theta) # 更新损失函数值

return theta, J_history

def plot_data(x, y):

plt.scatter(x[y==1, 0], x[y==1, 1], marker='+', label='Admitted')

plt.scatter(x[y==0, 0], x[y==0, 1], marker='o', label='Not admitted')

plt.xlabel('Exam 1 score')

plt.ylabel('Exam 2 score')

plt.legend()

def plot_boundary(theta, x):

x1 = np.arange(20, 110, 0.1)

x2 = -(theta[0] + theta[1] * x1) / theta[2]

plt.plot(x1, x2)

plt.show()

data = np.loadtxt('ex2data1.txt', delimiter=',')

x = data[:, [0, 1]] # 特征

y = data[:, 2] # 标签

plot_data(x, y) # 数据可视化

m = x.shape[0] # 样本数

n = x.shape[1] # 特征数

x = np.concatenate((np.ones((m, 1)), x), axis=1) # 添加截距项

y = y.reshape((-1, 1)) # 调整标签维度

theta, J_history = gradient_descent(x, y, alpha=0.001, num_iterations=100000) # 训练模型

print('Theta:', theta)

plot_boundary(theta, x) # 画出决策边界

上述代码中,首先定义了逻辑函数sigmoid(x),该函数用于将任意值映射到$(0, 1)$之间,该函数在逻辑回归算法中非常重要。

然后定义了计算损失函数compute_cost(x, y, theta)的函数,该函数通过逻辑回归的交叉熵损失函数计算模型的误差,并返回该模型的平均误差。

之后定义了梯度下降函数gradient_descent,该函数与梯度下降法的实现几乎相同,不同之处在于损失函数采用了逻辑回归的交叉熵损失函数。

最后,使用训练好的模型,可以通过绘制决策边界来看出逻辑回归的分类结果。

总结

本文介绍了梯度下降和逻辑回归的基本思路和实现方法,并通过样例代码进行了具体的阐述。梯度下降法是一种常用的迭代优化算法,适合用于求解函数的最小值;逻辑回归是一种常用的分类算法,其核心理论是概率论和最大似然估计,适用于处理二元分类问题。以上两种算法都是机器学习中的核心算法,对于初学者来说,熟练掌握这些基本算法是非常重要的。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签