简单线性回归(一个特征)学习笔记

简单线性回归(一个特征)的思路

 

思路:

假设x^{i} ,y^{^{i }} 基本符合 线性的关系,所以找到一条直线 y = ax+b  最大程度的拟合 x^{i} , y^{^{i }} ;

这样当给出新的x^{i} 时,就可以预测出 \hat{y^{i}}  = ax^{i} +b ;

目标: x 和 y 都是已知的 , 需要求出 a:斜率 、b:截距。

方法:

最小二乘法(最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。)

误差的平方(y^{^{i}}-\hat{y^{i}})^{2}  ;   考虑所有的样本    : 使  \sum_{i=1}^{m} (y^{^{i}}-\hat{y^{i}})^{2} 尽可能小; 

将  \hat{y^{i}}  = ax^{i} +b 带进  上面的式子 , 目标:找到 a  和 b 使得 \sum_{i=1}^{m} (y^{^{i}}-ax^{i}-b)^{2} 尽可能小 ;  这个函数称为损失函数。

最小二乘法:

  

称这个损失函数为 J(a , b ),目标是使这个函数J(a , b ) 最小 ;

对 J(a , b )  求导, 根据导数的定义,当 

就是J(a , b )极值的地方。

根据推到得到,当J(a , b )处于极值时:

 

编写一个简单线性回归的函数算法

通过传入 x_train ,y_train ,求出 a 和 b ; 并且可以当给定新的 x (向量)时候,预测出新的 y。

import numpy as np
class SimpleLinearRegression1:
    def __init__(self):
        '''初始化 Simple Linear Regression 模型'''
        self.a_ = None
        self.b_ = None
    def fit(self , x_train , y_train):
        assert x_train.ndim ==1
        assert x_train.shape[0] == y_train.shape[0]

        num = 0
        d = 0
        for x_i ,y_i in zip(x_train,y_train):
            num += (x_i -np.mean(x_train)) *(y_i -np.mean(y_train))
            d += (x_i - np.mean(x_train))**2

        self.a_ = num/d
        self.b_ = np.mean(y_train) - self.a_ *np.mean(x_train)
        return self

    def predict(self ,x_predict ):
        assert x_predict.ndim == 1
        assert self.a_ is not None and self.b_ is not  None



        return np.array([self._predict(x) for x in x_predict])
    def _predict(self,x_single):
        return self.a_ *x_single +self.b_

    def __repr__(self):
        return "SimpleLinearRegression1()"

向量化算法

在上面的算法中,求 a 的方法是使用 for 循环;可以改进为使用 向量的点乘 来加快算法的运算速度。

点乘:两个向量的点乘 ,每个对应的元素 相乘 再 相加。

观察a 的分子分母 ,可以发现分子分母实际都是 两个向量 点乘 的结果 ;

只需要改动 原代码中 fit 部分即可,其余代码保持不变:

    def fit(self , x_train , y_train):
        assert x_train.ndim ==1
        assert x_train.shape[0] == y_train.shape[0]

        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)
        num = (x_train-x_mean).dot(y_train-y_mean)
        d = (x_train-x_mean).dot(x_train-x_mean)


        self.a_ = num/d
        self.b_ = y_mean - self.a_ *x_mean
        return self

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多元线性回归是指依据多个自变量来预测因变量的一种回归分析方法。在Python中,使用Tensorflow2.3.0可以很方便地实现多元线性回归预测。 以下是一个简单的示例代码: ```python import tensorflow as tf import numpy as np # 设置训练数据 x_train = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.], [10., 11., 12.]]) y_train = np.array([[6.], [15.], [24.], [33.]]) # 定义模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(units=1, input_shape=[3]) ]) # 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(0.1), loss='mean_squared_error') # 训练模型 model.fit(x_train, y_train, epochs=1000) # 使用模型进行预测 x_test = np.array([[2., 3., 4.]]) y_predict = model.predict(x_test) print(y_predict) ``` 在这个示例中,首先定义了训练数据x_train和y_train,其中x_train包含了4组3个自变量的数据,y_train包含了对应的4组因变量的数据。 接着定义了一个模型,使用了Tensorflow中的Sequential模型,其中只有一个Dense层,它的输入维度为3(与自变量个数相同),输出维度为1(因变量个数)。 在模型编译时,使用了Adam优化器和均方误差作为损失函数。 接下来进行了1000次的训练,最后使用训练好的模型对一个新的测试数据进行预测,并打印出预测结果。 需要注意的是,在实际应用中,训练数据和测试数据的数量应该远远大于这个示例中的数量,同时还要考虑特征的选择和处理、模型的优化等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值