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
,该函数与梯度下降法的实现几乎相同,不同之处在于损失函数采用了逻辑回归的交叉熵损失函数。
最后,使用训练好的模型,可以通过绘制决策边界来看出逻辑回归的分类结果。
总结
本文介绍了梯度下降和逻辑回归的基本思路和实现方法,并通过样例代码进行了具体的阐述。梯度下降法是一种常用的迭代优化算法,适合用于求解函数的最小值;逻辑回归是一种常用的分类算法,其核心理论是概率论和最大似然估计,适用于处理二元分类问题。以上两种算法都是机器学习中的核心算法,对于初学者来说,熟练掌握这些基本算法是非常重要的。