【机器学习笔记】一元线性回归原理、公式及代码实现

线性回归是逻辑回归的基础,逻辑回归又是神经网络的组成部分,用于解决2分类问题

线性回归是所有算法的基础

概念:

  • 线性关系是指变量之间的关系是一次函数,一个自变量x和因变量y的关系表示为 一条直线,两个自变量和因变量y的关系表示为 一个平面
  • 非线性关系是指一个自变量x和因变量y的关系表示为 一条曲线,两个自变量和因变量y的关系表示为 *一个曲面

一个自变量x就等同于一个特征,拟合的时候就是一条线,而如果是多个特征,则是拟合面
线性关系可以理解为就是一次函数,不管有多少个自变量

示例:

  • 线性关系:$$y = a\times x + b$$
  • 非线性关系:$$y = x^2$$

概念:预测一个连续问题的数值,

线性回归主要用于处理回归问题,少数情况用于处理分类问题

概念:用来描述自变量和因变量都只有一个(一个自变量称为一元)的情况,且自变量和因变量之间呈线性关系(一次函数)的回归模型

表示形式:$$y = a \times x + b$$

只有x一个 自变量,y为 因变量,a为 斜率,也称为 x的权重,b为 截距

作用:通过一元线性回归模型寻找到一条合适的直线,最大程度地拟合自变量 x 和因变量 y 之间的关系,这样我们知道一个 x 的值,就可以通过这条拟合的直线找到最可能的 y

学习一元线性模型的过程就算通过训练数据得到合适的a和b的过程,也就是该一元线性模型的参数即为 a 和 b,当输入一个新的测试数据点的时候,我们可以通过训练好的模型来进行预测。

模型好坏评价方式

目标:预测值与真实值之间的差距越小越好,距离越小,代表我们的模型效果越好

很自然的一个想法是:对于每一个点(x)都计算

[y – y_predict ]

然后将所有的值进行累加最后除以样本数,这样是为了减少样本对于结果的影响。

公式:

[\displaystyle\frac{1}{n}\displaystyle \sum_{i=1}^{n}(y^i-y_predict^i) ]

这个公式存在的问题:预测出来的值有可能大于真实值也可能小于真实值,这将导致误差被虚弱,正负中和导致最终累加误差接近于 0

改进:对每个点的误差计算取绝对值,也就是(|y^i-y_predict^i|),之后我们再进行累加

问题:后续的误差计算以及求导问题

绝对值函数,比如$$y = |x|$$在x=0处连续,但是在x处左导数为-1,右导数为1,不相等,可导函数必须光滑,所以函数在x=0不可导

进一步优化:对于每个点计算得到的误差,对这个结果做一次平方,并且为了忽略样本数的影响,取平均值

公式:

[\displaystyle\frac{1}{n}\displaystyle \sum_{i=1}^{n}(y^i-y_predict^i)^2 ]

最小二乘法

[\displaystyle y_predict^i=ax^i+b ]

代入上一节的公式中

[\displaystyle\frac{1}{n}\displaystyle \sum_{i=1}^{n}(y^i-ax^i-b)^2 ]

通过最小二乘法来寻找最优的参数 a 和 b,从而使这个表达式尽可能的小

概念:一种数学优化技术,通过最小化误差的平方和来寻找最优的参数

公式:

[\displaystyle a=\frac{\sum_{i=1}^{n}(x^i-\overline x)(y^i-\overline y)}{\sum_{i=1}^{n}(x^i-\overline x)^2} ]

[\displaystyle b = \overline y – a\overline x ]

代码实现

import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    # 准备数据
    x = np.array([1, 2, 4, 6, 8])  # 一元线性回归模型仅处理向量,而不能处理矩阵
    y = np.array([2, 5, 7, 8, 9])
    x_mean = np.mean(x)
    y_mean = np.mean(y)

    # 求a和b
    denominator = 0.0  # 分母
    numerator = 0.0  # 分子
    for x_i, y_i in zip(x, y):  # 将x, y向量合并起来形成元组(1, 2)、(2, 5)
        numerator += (x_i - x_mean) * (y_i - y_mean)
        denominator += (x_i - x_mean) ** 2
    a = numerator / denominator
    b = y_mean - a * x_mean

    # 用a和b构造线性函数,输出的预测值存入y_predict
    y_predict = a * x + b  # 这个函数是非常拟合训练集x的

    # 画出这条直线,以及训练集的数据
    plt.scatter(x, y, color='b')
    plt.plot(x, y_predict, color='r')
    plt.xlabel('x', fontsize=15)
    plt.ylabel('y', fontsize=15)
    plt.show()

    # 输入测试数据,回归一个值
    x_test = 7
    y_predict_test = a * x_test + b
    print(y_predict_test)

一元线性回归模型仅处理向量,而不能处理矩阵

进行一定的封装以后:

import numpy as np
import matplotlib.pyplot as plt

class SimpleLinearRegressionSelf:

    # 初始化变量
    def __init__(self):
        """初始化simple linear regression模型"""
        self.a_ = None  # 类内使用,非用户外部输入的变量
        self.b_ = None  # 类内使用,非用户外部输入的变量

    # 训练模型
    def fit(self, x_train, y_train):
        assert x_train.ndim == 1
        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)
        denominator = 0.0
        numerator = 0.0

        for x_i, y_i in zip(x_train, y_train):
            numerator += (x_i - x_mean) * (y_i - y_mean)
            denominator += (x_i - x_mean) ** 2
        self.a_ = numerator / denominator
        self.b_ = y_mean - self.a_ * x_mean

        return self

    # 预测
    def predict(self, x_test_group): # 输入的是向量集合
        # 对输入向量集合中的每一个向量都进行一次预测,预测的具体实现被封装在_predict函数中
        return np.array([self._predict(x_test) for x_test in x_test_group])

    def _predict(self, x_test):
        # 求每一个输入的x_test以得到预测值
        return self.a_ * x_test + self.b_

    # 衡量模型分数
    def mean_squared_error(self, y_true, y_predict):
        return np.sum((y_true - y_predict) ** 2) / len(y_true)

    def r_square(self, y_true, y_predict):
        # 计算指定数据(数组元素)沿指定轴的方差
        return 1 - (self.mean_squared_error(y_true, y_predict) / np.var(y_true))

if __name__ == '__main__':
    x = np.array([1, 2, 4, 6, 8])
    y = np.array([2, 5, 7, 8, 9])

    lr = SimpleLinearRegressionSelf()
    lr.fit(x, y)
    print(lr.predict([7]))
    print(lr.r_square([8, 9], lr.predict([6, 8])))

此处衡量模型分数的公式为:

[\displaystyle R^2 = 1-\frac{\frac{1}{n}\sum_{i=1}^{n}(y_predict^i-y^i)^2}{\sum_{i=1}^{n}(\overline y-y^i)^2} ]

Original: https://www.cnblogs.com/seansheep/p/15890259.html
Author: 在青青草原上抓羊
Title: 【机器学习笔记】一元线性回归原理、公式及代码实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608985/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis下载及安装(windows版)

    下载地址1、Github下载地址:https://github.com/MicrosoftArchive/redis/releases2、百度网盘下载地址 https://pan….

    Linux 2023年5月28日
    088
  • 面试连环炮系列(二十七):如何保证缓存与数据库的数据一致性

    1. 如何保证缓存与数据库的数据一致性? 要保持数据强一致性,只能将读请求和写请求串行化,在同一个内存队列里执行。但是串行化会导致系统的吞吐量大幅度降低,多用几倍的机器去支撑线上的…

    Linux 2023年6月6日
    086
  • jmeter 安装与环境变量配置

    安装jmeter首先要安装与jmeter版本兼容的JDK,安装完成JDK后才能安装jmeter,JDK可以自行在官网下载或者通过360软件管家进行下载。 1、下载安装JDK 安装完…

    Linux 2023年6月8日
    093
  • windows环境下启动多个redis服务(搭建redis集群)

    windows环境下启动多个redis服务(搭建redis集群一) 最终效果:本地安装好3个(多个)端口的redis服务。 1.下载并安装Redis 下载地址:https://gi…

    Linux 2023年5月28日
    097
  • POJ1979(Red and Black)–FloodFill

    题目在这里 题目意思是这样的,一个人起始位置在 ‘@’ 处,他在途中能到达的地方为 ‘ . ‘ 而 ‘#’ …

    Linux 2023年6月7日
    0102
  • js学习笔记——条件 循环

    今天发现之前学的爱前端的课中JS部分函数等不全,果断换了一个课——渡一的《Web前端开发JavaScript高薪课堂》接着学习,不过废话有点多 语法:1、单if,条件成立,执行语句…

    Linux 2023年6月13日
    072
  • Python中使用 for 循环来拿遍历 List 的值

    常规版本 简单的 for 循环遍历 x_n = ["x1","x2","x3"] for x in x_n: print…

    Linux 2023年6月7日
    086
  • Linux基础学习(一)

    Linux发行版 以软件包格式:rpm:Red Hat Enterprise LinuxCentOSopenSUSEFedoradeb:DebianUbuntulinux mint…

    Linux 2023年5月27日
    080
  • kubeadm 加入新master 报错

    error execution phase check-etcd: error syncing endpoints with etcd: context deadline exce…

    Linux 2023年6月14日
    0125
  • CAP 5.1 版本发布通告 你期待的 Redis 来了

    前言 今天,我们很高兴宣布 CAP 发布 5.1 版本正式版,在这个版本里我们同样引入了更多令人激动的新特性和改进,同时也得到越来越多人的喜爱。 得益于社区的反馈和贡献者的支持,在…

    Linux 2023年5月28日
    0106
  • 一劳永逸,解决.NET发布云服务器的时区问题

    国内大多数开发者使用的电脑,都是使用的北京时间,日常开发的过程中其实并没有什么不便;不过,等遇到了阿里云等云服务器,系统默认使用的时间大多为 UTC时间,这个时候,时区和时间的问题…

    Linux 2023年6月6日
    095
  • ansible-复制模块

    简介:临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook。 1、复制模块 可在终端执行ansible-doc copy…

    Linux 2023年6月6日
    0114
  • Python 排序算法之快速排序

    快速排序之分治法三步走 """ 快速排序 分治法(divide and conquer),三步走 1. Partition:选择一个基准(pivot)…

    Linux 2023年6月13日
    0103
  • 【小记】腾讯云 Linux 虚拟机如何正确修改 hosts 文件

    如果直接修改 /etc/hosts 文件,重启后设置会丢失还原,原因是腾讯云虚拟机默认使用了 Cloud-Init 进行初始化操作。 参见:https://cloud.tencen…

    Linux 2023年6月13日
    092
  • QT删除整个文件夹

    故事背景:因为客户端要清理旧版本以及日志文件,所以需要删除一个月以前的所有文件夹 技术调研:在程序中我想把文件夹直接删除,但是调用QDir中的rmdir()或者rmpath()时要…

    Linux 2023年6月13日
    0111
  • Centos7.9、Ubuntu操作系统图文安装

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 一、环境准备 1、镜像包 CentOS-7.9-x86_64-DVD-2009.isoubuntu-18.04.6-server…

    Linux 2023年5月27日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球