《机器学习》学习笔记

机器学习

线性模型

模型描述

image-20230725234006154

回归:预测一个具体的数值输出

notation:

m:训练样本的数量

x:输入变量(input)

y:输出变量(target)

(x,y)表示训练样本

image-20230725234412922

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 Θ

这个代价函数也被称作平方误差函数,是解决回归问题的最常用手段

总结:

image-20230726001229374

梯度下降

存在函数 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)

image-20230727014554968

image-20230727014615876

define:

Θ j : = Θ j − α ∂ ∂ Θ j J ( Θ 0 , Θ 1 ) \Theta_j:=\Theta_j-\alpha \frac{\partial}{\partial\Theta_j}J(\Theta_0,\Theta_1) Θj:=ΘjαΘjJ(Θ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) ΘjJ(Θ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αΘjJ(Θ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αΘjJ(Θ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 ΘjJ(Θ0,Θ1)=θj2m1(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 =θj2m1(θ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:ΘjJ(Θ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:ΘjJ(Θ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 也为一维。

在这个例子中,我们通过 Xy 定义了线性回归的训练数据。然后,我们创建了一个模型对象 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函数进行预测,并打印出预测结果。

请注意,这只是一个简单的线性回归模型实现示例,实际应用中可能需要进行更多的数据预处理、模型评估和调参等步骤来得到更好的结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值