关于逻辑回归向量化的一点总结

本文通过Python实现斯坦福大学机器学习课程中的逻辑回归算法,并详细记录了从数据加载到模型训练的过程,包括S形函数、代价函数及梯度计算等关键步骤。

照斯坦福的机器学习课程用Octave敲了一下逻辑回归的算法  然后搬到python上各种出问题...感觉自己对向量化 还是理解不够彻底 又重新推导了一遍

用的数据集是课程的作业  training data包含100条数据 两个特征(两门课程的分数) 一个类别(能否入学)

#加载数据集
data = np.loadtxt(path, dtype = float, encoding = 'utf-8', delimiter = ',')
X = data[:, 0:2]#二维数组 100x2
y = data[:, 2]#一维数组 1x100

需要把y转换为100x1的列向量 方法有很多 

#y = np.c_[data[:, 2]]#100x1
y = data[:, 2].reshape(-1, 1)#100x1

逻辑回归假设函数:


#S形函数(h(x;theta))
def sigmoid(z):
	return 1 / (1 + np.exp(-z))
#100x1

X = [ ]100x3(添加x0 ==1), theta = [ ]1x3, X * theta'= [ ]100x1

代价函数:


向量化:


#代价函数
def costFunction(theta, X, y):
	m = y.size#100
	h = sigmoid(X.dot(theta.reshape(-1, 1)))#100x1

	J = -1 * (1 / m) * (np.log(h).T.dot(y) + np.log(1 - h).T.dot(1 - y))#1x1

	if np.isnan(J[0]):
		return(np.inf)
	return J[0]

相当于两矩阵对应行点乘之后 求和

梯度 也就是代价函数对theta(j)的偏导:


向量化:


#计算梯度
def compute_grad(theta, X, y):
	m = y.size
	h = sigmoid(X.dot(theta.reshape(-1, 1)))#100x1

	grad = (1 / m) * ((h - y).T.dot(X))#应该是1x3的行向量 有三个theta值
	#但是打印出的结果为100x3的矩阵
	#===因为刚开始定义的y 是1x100的行向量
	return grad#1x3

梯度算法 目的是求costFunction的最小值和最小值点的theta

用scipy.optimize中的minimize函数

from scipy.optimize import minimize#无约束最小化损失函数
res = minimize(costFunction, initial_theta, args = (X, y),
	jac = compute_grad, options = {'maxiter': 400})
#test1LogisticRegression.py:43: RuntimeWarning: 
#divide by zero encountered in log
#  J = -1 * (1 / m) * (np.log(h).T.dot(y) + np.log(1 - h).T.dot(1 - y))#1x1
#test1LogisticRegression.py:43: RuntimeWarning: divide by zero encountered in log
#  J = -1 * (1 / m) * (np.log(h).T.dot(y) + np.log(1 - h).T.dot(1 - y))#1x1
#      fun: 0.20349770158950983
# hess_inv: array([[ 2.85339493e+03, -2.32908823e+01, -2.27416470e+01],
#       [-2.32908823e+01,  2.04489131e-01,  1.72969525e-01],
#       [-2.27416470e+01,  1.72969525e-01,  1.96170322e-01]])
#      jac: array([-2.68557634e-09,  4.36433479e-07, -1.39671758e-06])
#  message: 'Optimization terminated successfully.'
#     nfev: 34
#      nit: 25
#     njev: 30
#   status: 0
#  success: True
#        x: array([-25.16131634,   0.2062316 ,   0.20147143])
最后得到的theta为
[-25.16131634,   0.2062316 ,   0.20147143]

预测函数

def predict(theta, X, threshold = 0.5):
	p = sigmoid(X.dot(theta.T)) >= threshold
	return(p.astype('int'))

对分数为[30, 43]的同学进行预测

pre = sigmoid(np.array([1, 30, 43]).dot(res.x.T))
3.326083521580104e-05
#近似于零


参考:

https://blog.youkuaiyun.com/han_xiaoyang/article/details/49123419

<think>我们正在讨论多元线性回归的向量化。根据引用内容,特别是引用[1]和引用[3],我们知道多元线性回归是指有多个特征(变量)的线性回归模型。向量化是一种用向量和矩阵运算来简化计算的方法,可以大大提高计算效率。 ### 多元线性回归模型 假设我们有$n$个特征和$m$个样本,则多元线性回归模型可以表示为: $$\hat{y}^{(i)} = \theta_0 + \theta_1 x_1^{(i)} + \theta_2 x_2^{(i)} + \dots + \theta_n x_n^{(i)}$$ 其中,$\hat{y}^{(i)}$是第$i$个样本的预测值,$x_j^{(i)}$是第$i$个样本的第$j$个特征值,$\theta_j$是第$j$个特征的系数($\theta_0$是截距)。 为了便于向量化,我们引入一个额外的特征$x_0=1$,这样模型可以写成向量形式: $$\hat{y}^{(i)} = \theta_0 x_0^{(i)} + \theta_1 x_1^{(i)} + \dots + \theta_n x_n^{(i)} = \mathbf{\theta}^T \mathbf{x}^{(i)}$$ 其中,$\mathbf{\theta} = [\theta_0, \theta_1, \dots, \theta_n]^T$,$\mathbf{x}^{(i)} = [x_0^{(i)}, x_1^{(i)}, \dots, x_n^{(i)}]^T$。 将所有样本的预测值堆叠成一个向量,则整个数据集的预测可以表示为: $$\mathbf{\hat{y}} = \mathbf{X} \mathbf{\theta}$$ 其中,$\mathbf{X}$是一个$m \times (n+1)$的矩阵(称为设计矩阵),每一行是一个样本的特征向量(包含$x_0=1$),$\mathbf{\theta}$是$(n+1) \times 1$的系数向量,$\mathbf{\hat{y}}$是$m \times 1$的预测值向量。 ### 成本函数 在多元线性回归中,我们通常使用均方误差(MSE)作为成本函数: $$J(\mathbf{\theta}) = \frac{1}{2m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)})^2$$ 使用向量化表示,可以写成: $$J(\mathbf{\theta}) = \frac{1}{2m} (\mathbf{X}\mathbf{\theta} - \mathbf{y})^T (\mathbf{X}\mathbf{\theta} - \mathbf{y})$$ 其中,$\mathbf{y}$是所有样本真实值组成的向量。 ### 向量化的优势 向量化利用线性代数运算(如矩阵乘法)代替循环,可以显著提高计算效率。例如,计算预测值$\mathbf{\hat{y}}$时,使用矩阵乘法$\mathbf{X}\mathbf{\theta}$,在NumPy等库中,矩阵乘法由高度优化的BLAS库实现,比循环快得多。 ### 梯度下降的向量化 在梯度下降中,我们需要计算成本函数关于参数$\mathbf{\theta}$的梯度。梯度是一个向量,其第$j$个分量为: $$\frac{\partial}{\partial \theta_j} J(\mathbf{\theta}) = \frac{1}{m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)}) x_j^{(i)}$$ 使用向量化,整个梯度向量可以表示为: $$\nabla_{\mathbf{\theta}} J(\mathbf{\theta}) = \frac{1}{m} \mathbf{X}^T (\mathbf{X}\mathbf{\theta} - \mathbf{y})$$ 这样,我们可以用一次矩阵运算就计算出所有参数的梯度,然后更新参数: $$\mathbf{\theta} := \mathbf{\theta} - \alpha \nabla_{\mathbf{\theta}} J(\mathbf{\theta})$$ 其中,$\alpha$是学习率。 ### 应用 向量化机器学习中广泛应用,特别是在处理大规模数据集时。它不仅用于线性回归,还用于逻辑回归、神经网络等。在Python中,使用NumPy数组和矩阵运算可以轻松实现向量化,从而加速计算。 ### 示例代码 以下是一个简单的多元线性回归向量化实现的伪代码(参考引用[4]的封装思想,但使用向量化): ```python import numpy as np class LinearRegression: def __init__(self): self.theta = None # 参数向量 def fit(self, X, y, alpha=0.01, iterations=1000): # 添加截距项(x0=1) m = X.shape[0] X_b = np.c_[np.ones((m, 1)), X] # 设计矩阵 # 初始化参数 n_features = X_b.shape[1] self.theta = np.random.randn(n_features, 1) # 梯度下降 for _ in range(iterations): gradients = (1/m) * X_b.T.dot(X_b.dot(self.theta) - y.reshape(-1,1)) self.theta -= alpha * gradients def predict(self, X): # 添加截距项 X_b = np.c_[np.ones((X.shape[0], 1)), X] return X_b.dot(self.theta) ``` 注意:上述代码中,我们假设y是列向量。实际应用中还需考虑特征缩放、迭代停止条件等优化。 ### 总结 向量化通过矩阵运算代替循环,使得多元线性回归的计算更加高效。它在模型预测、成本计算和梯度下降中都起到了关键作用,是机器学习算法实现中的重要技术[^1][^3]。 §§相关问题§§ 1. 多元线性回归中特征缩放的作用是什么? 2. 除了梯度下降,还有哪些方法可以求解多元线性回归? 3. 向量化逻辑回归中是如何应用的? </think> ### 多元线性回归向量化的原理、方法及应用 #### 1. **向量化的核心原理** 向量化利用线性代数运算替代循环,将多元线性回归的数学表达式转换为矩阵运算,显著提升计算效率。核心原理包括: - **模型表示**: 设特征矩阵 $X \in \mathbb{R}^{m \times (n+1)}$(含截距项),参数向量 $\theta \in \mathbb{R}^{(n+1) \times 1}$,预测值 $\hat{y} = X\theta$。 其中 $m$ 为样本数,$n$ 为特征数。 - **成本函数**: 均方误差(MSE)的向量化表示为: $$J(\theta) = \frac{1}{2m} (X\theta - y)^T (X\theta - y)$$ 其中 $y$ 是真实值向量。 - **梯度计算**: 梯度下降的向量化更新公式为: $$\theta := \theta - \frac{\alpha}{m} X^T (X\theta - y)$$ 其中 $\alpha$ 为学习率[^1]。 #### 2. **向量化的实现方法** 对比非向量化实现,向量化通过矩阵运算消除循环: - **非向量化计算**(低效): ```python for j in range(n_features): grad = 0 for i in range(m): grad += (X[i] @ theta - y[i]) * X[i, j] theta[j] -= alpha * grad / m ``` - **向量化实现**(高效): ```python grad = (1/m) * X.T @ (X @ theta - y) # 计算梯度 theta -= alpha * grad # 更新参数 ``` **关键优势**: - 利用BLAS库并行计算,复杂度从 $O(mn)$ 降至近似 $O(1)$(硬件优化后)。 - 代码简洁且避免Python循环开销。 #### 3. **实际应用场景** - **大规模数据集**: 当特征数 $n$ 或样本数 $m$ 较大时(如 $n>10^3$),向量化可加速训练数百倍。 - **深度学习基础**: 神经网络中的全连接层本质是 $\mathbf{Wx} + \mathbf{b}$ 的向量化运算。 - **科学计算库优化**: NumPy、TensorFlow等库底层使用C/Fortran实现矩阵运算,充分发挥CPU/GPU并行能力[^4]。 #### 4. **示例代码(向量化实现)** ```python import numpy as np class VectorizedLinearRegression: def __init__(self, alpha=0.01, iterations=1000): self.alpha = alpha # 学习率 self.iterations = iterations # 迭代次数 self.theta = None # 参数向量 def fit(self, X, y): m, n = X.shape X_b = np.c_[np.ones((m, 1)), X] # 添加截距项 (m x n+1) self.theta = np.zeros((n+1, 1)) # 初始化参数 for _ in range(self.iterations): gradients = (1/m) * X_b.T @ (X_b @ self.theta - y.reshape(-1,1)) self.theta -= self.alpha * gradients def predict(self, X): X_b = np.c_[np.ones((X.shape[0], 1)), X] return X_b @ self.theta ``` **关键步骤说明**: 1. `X_b` 添加全1列以支持截距项 $\theta_0$。 2. 梯度计算 `X_b.T @ (X_b @ theta - y)` 对应公式 $\nabla_\theta J = \frac{1}{m}X^T(X\theta - y)$。 3. 矩阵维度:$X_b \in \mathbb{R}^{m \times (n+1)}$, $\theta \in \mathbb{R}^{(n+1) \times 1}$,$y \in \mathbb{R}^{m \times 1}$。 #### 5. **应用注意事项** - **特征缩放**: 不同特征量纲差异大时,需标准化(如Z-score)以加速收敛。 - **正则化**: 防止过拟合,可在成本函数中添加L2项:$J(\theta) + \frac{\lambda}{2m} \|\theta\|^2$。 - **数值稳定性**: 当 $X^TX$ 不可逆时,使用伪逆 `np.linalg.pinv` 或添加小扰动[^2]。 ### 总结 向量化通过矩阵运算将多元线性回归的复杂度从 $O(mn)$ 降至硬件优化级别,成为机器学习库的基础优化技术。它在处理高维数据、实时预测及深度学习模型中具有核心应用价值[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值