机器学习
线性模型
模型描述
回归:预测一个具体的数值输出
notation:
m:训练样本的数量
x:输入变量(input)
y:输出变量(target)
(x,y)表示训练样本
h:hypothesis(函数)
损失函数(代价函数)
h Θ ( x ) = Θ 0 + Θ 1 x h_\Theta(x)=\Theta_0+\Theta_1x hΘ(x)=Θ0+Θ1x
Θ \Theta Θ是模型函数
需要尽量选择参数,使得在训练集中,给出训练集x的值,可以合理准确的预测出y的值
min Θ 0 Θ 1 1 2 m ∑ ( h Θ ( x ) − y ) 2 \mathop{\min}\limits_{\Theta_0\Theta_1}\frac{1}{2m}\sum(h_\Theta(x)-y)^2 Θ0Θ1min2m1∑(hΘ(x)−y)2
这里的 1 2 m \frac{1}{2m} 2m1是为了开导时刚到抵消掉平方,对优化结果来说无影响
对上述式子求min,得出最优 Θ \Theta Θ
这个代价函数也被称作平方误差函数,是解决回归问题的最常用手段
总结:
梯度下降
存在函数 J ( Θ 0 , Θ 1 ) J(\Theta_0, \Theta_1) J(Θ0,Θ1)
想得到 min Θ 0 Θ 1 J ( Θ 0 , Θ 1 ) \mathop{\min}\limits_{\Theta_0\Theta_1}J(\Theta_0, \Theta_1) Θ0Θ1minJ(Θ0,Θ1)
define:
Θ j : = Θ j − α ∂ ∂ Θ j J ( Θ 0 , Θ 1 ) \Theta_j:=\Theta_j-\alpha \frac{\partial}{\partial\Theta_j}J(\Theta_0,\Theta_1) Θj:=Θj−α∂Θj∂J(Θ0,Θ1) ( f o r j = 0 a n d j = 1 ) (for\space j\space =\space 0\space and\space j =\space 1) (for j = 0 and j= 1)
: = := :=表示赋值
α \alpha α表示梯度下降时,迈出多大的步子(学习速率)
∂ ∂ Θ j J ( Θ 0 , Θ 1 ) \frac{\partial}{\partial\Theta_j}J(\Theta_0,\Theta_1) ∂Θj∂J(Θ0,Θ1)是一个导数项
需要同时更新 Θ 0 , Θ 1 \Theta_0,\Theta_1 Θ0,Θ1
t e m p 0 : = Θ 0 − α ∂ ∂ Θ j J ( Θ 0 , Θ 1 ) temp0:=\Theta_0-\alpha \frac{\partial}{\partial\Theta_j}J(\Theta_0,\Theta_1) temp0:=Θ0−α∂Θj∂J(Θ0,Θ1)
t e m p 1 : = Θ 1 − α ∂ ∂ Θ j J ( Θ 0 , Θ 1 ) temp1:=\Theta_1-\alpha \frac{\partial}{\partial\Theta_j}J(\Theta_0,\Theta_1) temp1:=Θ1−α∂Θj∂J(Θ0,Θ1)
Θ 0 : = t e m p 0 \Theta_0:=temp0 Θ0:=temp0
Θ 1 : = t e m p 1 \Theta_1:=temp1 Θ1:=temp1
∂ ∂ Θ j J ( Θ 0 , Θ 1 ) = ∂ ∂ θ j ∙ 1 2 m ∑ ( h Θ ( x ) − y ) 2 \frac{\partial}{\partial\Theta_j}J(\Theta_0,\Theta_1)=\frac{\partial}{\partial \theta_j}\bullet \frac{1}{2m}\sum(h_\Theta(x)-y)^2 ∂Θj∂J(Θ0,Θ1)=∂θj∂∙2m1∑(hΘ(x)−y)2
= ∂ ∂ θ j ∙ 1 2 m ∑ ( θ 0 + θ 1 x ( i ) − y ( i ) ) 2 =\frac{\partial}{\partial \theta_j}\bullet \frac{1}{2m}\sum(\theta_0+\theta_1x^{(i)}-y^{(i)})^2 =∂θj∂∙2m1∑(θ0+θ1x(i)−y(i))2
j = 0 : ∂ ∂ Θ j J ( Θ 0 , Θ 1 ) = ∂ ∂ θ ∙ 1 m ∑ ( h ( x ( i ) ) − y ( i ) ) j = 0 : \frac{\partial}{\partial\Theta_j}J(\Theta_0,\Theta_1)=\frac{\partial}{\partial \theta}\bullet \frac{1}{m}\sum(h(x^{(i)})-y^{(i)}) j=0:∂Θj∂J(Θ0,Θ1)=∂θ∂∙m1∑(h(x(i))−y(i))
j = 1 : ∂ ∂ Θ j J ( Θ 0 , Θ 1 ) = ∂ ∂ θ ∙ 1 m ∑ ( h ( x ( i ) ) − y ( i ) ) ∙ x ( i ) j = 1 : \frac{\partial}{\partial\Theta_j}J(\Theta_0,\Theta_1)=\frac{\partial}{\partial \theta}\bullet \frac{1}{m}\sum(h(x^{(i)})-y^{(i)})\bullet x^{(i)} j=1:∂Θj∂J(Θ0,Θ1)=∂θ∂∙m1∑(h(x(i))−y(i))∙x(i)
code
import numpy as np
# 定义梯度下降的线性回归模型类
class LinearRegression:
def __init__(self, learning_rate=0.01, num_iters=1000):
self.learning_rate = learning_rate # 学习率
self.num_iters = num_iters # 迭代次数
self.weights = None # 线性回归的权重
self.bias = None # 线性回归的偏差
def fit(self, X, y):
num_samples, num_features = X.shape
# 初始化权重和偏差为0
self.weights = np.zeros(num_features)
self.bias = 0
# 梯度下降迭代
for _ in range(self.num_iters):
# 计算线性关系预测值
y_pred = np.dot(X, self.weights) + self.bias
# 计算误差
error = y_pred - y
# 计算梯度
dw = (1 / num_samples) * np.dot(X.T, error)
db = (1 / num_samples) * np.sum(error)
# 更新权重和偏差
self.weights -= self.learning_rate * dw
self.bias -= self.learning_rate * db
def predict(self, X):
# 使用训练得到的权重和偏差进行预测
y_pred = np.dot(X, self.weights) + self.bias
return y_pred
# 测试例子
X = np.array([[1], # 样本1
[2], # 样本2
[4], # 样本3
[3], # 样本4
[5]]) # 样本5
y = np.array([3, 4, 6, 5, 7]) # 目标变量
# 创建线性回归模型对象
model = LinearRegression(learning_rate=0.01, num_iters=1000)
# 拟合数据
model.fit(X, y)
# 进行预测
X_test = np.array([[2], [6]])
predictions = model.predict(X_test)
print("预测结果:", predictions)
特征数据 X
为一维,因为这里只有一个特征 x。对应的目标变量 y
也为一维。
在这个例子中,我们通过 X
和 y
定义了线性回归的训练数据。然后,我们创建了一个模型对象 model
,并使用 fit
函数拟合数据。最后,通过 predict
函数进行预测。
需要注意的是,这只是一个简单的线性回归模型实现示例,在实际应用中,可能需要考虑更多的特征和复杂性,以获得更准确的预测结果。
import numpy as np
# 定义梯度下降的线性回归模型类
class LinearRegression:
def __init__(self, learning_rate=0.01, num_iters=1000):
self.learning_rate = learning_rate # 学习率
self.num_iters = num_iters # 迭代次数
self.weights = None # 线性回归的权重
self.bias = None # 线性回归的偏差
def fit(self, X, y):
num_samples, num_features = X.shape
# 初始化权重和偏差为0
self.weights = np.zeros(num_features)
self.bias = 0
# 梯度下降迭代
for _ in range(self.num_iters):
# 计算线性关系预测值
y_pred = np.dot(X, self.weights) + self.bias
# 计算误差
error = y_pred - y
# 计算梯度
dw = (1 / num_samples) * np.dot(X.T, error)
db = (1 / num_samples) * np.sum(error)
# 更新权重和偏差
self.weights -= self.learning_rate * dw
self.bias -= self.learning_rate * db
def predict(self, X):
# 使用训练得到的权重和偏差进行预测
y_pred = np.dot(X, self.weights) + self.bias
return y_pred
# 测试例子
X = np.array([[1, 1], # 样本1
[2, 3], # 样本2
[4, 3], # 样本3
[3, 2], # 样本4
[5, 5]]) # 样本5
y = np.array([4.8, 7.6, 8.8, 6.1, 10.1]) # 目标变量
# 创建线性回归模型对象
model = LinearRegression(learning_rate=0.01, num_iters=1000)
# 拟合数据
model.fit(X, y)
# 进行预测
X_test = np.array([[2, 1], [6, 5]])
predictions = model.predict(X_test)
print("预测结果:", predictions)
这段代码实现了一个简单的梯度下降的线性回归模型。我们首先定义了一个LinearRegression
类,包含了初始化函数__init__
、拟合函数fit
和预测函数predict
。在fit
函数中,我们使用梯度下降方法来更新模型的权重和偏差,并在predict
函数中使用训练得到的权重和偏差进行预测。
在测试例子中,我们使用了包含5个样本的2维特征数据X
和对应的目标变量y
。然后创建了一个模型对象model
,并使用fit
函数拟合数据。最后,我们使用predict
函数进行预测,并打印出预测结果。
请注意,这只是一个简单的线性回归模型实现示例,实际应用中可能需要进行更多的数据预处理、模型评估和调参等步骤来得到更好的结果。
模型的权重和偏差,并在predict
函数中使用训练得到的权重和偏差进行预测。
在测试例子中,我们使用了包含5个样本的2维特征数据X
和对应的目标变量y
。然后创建了一个模型对象model
,并使用fit
函数拟合数据。最后,我们使用predict
函数进行预测,并打印出预测结果。
请注意,这只是一个简单的线性回归模型实现示例,实际应用中可能需要进行更多的数据预处理、模型评估和调参等步骤来得到更好的结果。