首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >线性回归算法

线性回归算法

作者头像
Hsinyan
发布于 2022-06-19 09:45:37
发布于 2022-06-19 09:45:37
54900
代码可运行
举报
运行总次数:0
代码可运行

算法简介

  • 解决回归问题
  • 思想简单,实现容易
  • 许多强大的非线性模型的基础
  • 结果具有很强的解释性
  • 蕴含机器学习中很多的重要思想

线性回归算法可以简单概括为,寻找一条直线,最大程度地“拟合”样本特征和样本输出标记之间的关系。

推导

假设我们找到了最佳拟合的直线方程y=ax+b,则对于每个样本点x^{(i)} ,根据我们的直线方程,预测值就为\hat{y}^{(i)}=ax^{(i)}+b,我们希望真值y^{(i)}\hat{y}^{(i)}之间的差距尽量的小,可以用(y^{(i)}-\hat{y}^{(i)})^2来衡量真实值与预测值之间的差距,考虑到所有的样本,则是

\sum\limits_{i=1}^{m}(y^{(i)}-\hat{y}^{(i)})^2

其中

\hat{y}^{(i)}=ax^{(i)}+b

我们想使得上述函数尽可能小,那么我们的问题可以转化为找到a和b使得\sum\limits_{i=1}^{m}(y^{(i)}-\hat{y}^{(i)})^2尽可能小,我们一般把这个函数称为损失函数(loss function)或者效用函数(utillity function),通过分析问题,确定问题的损失函数或者效用函数,通过优化损失函数或者效用函数,可以获得机器学习的模型,对于几乎所有的参数学习的算法,都是这样的套路,比如线性回归、多项式回归、逻辑回归和SVM等。

对于上述的式子,可以得到整理后的损失函数为:

\sum\limits_{i=1}^{m}(y^{(i)}-ax^{(i)}-b)^2

这是一个典型的最小二乘法问题,即最小化误差的平方,可以得到

a=\frac{\sum_\limits{i=1}^{m}\left(x^{(i)}-\bar{x}\right)\left(y^{(i)}-\bar{y}\right)}{\sum\limits_{i=1}^{m}\left(x^{(i)}-\bar{x}\right)^{2}}
b=\overline{y}-a\overline{x}

了便于算法的运行效率,我们尝试转化成向量化计算的形式,即\sum\limits_{i=1}^{m}w^{(i)}v^{(i)}这种形式,对于分子,令w^{(i)}=x^{(i)}-\bar{x},v^{(i)}=y^{(i)}-\bar{y},令w=(w^{(1)}),w^{(2)},....,w^{(n)}),v=(v^{(1)}),v^{(2)},....,v^{(n)}),则\sum\limits_{i=1}^{m}w^{(i)}v^{(i)}可以看作是w\cdot v

简单实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1.,2.,3.,4.,5.])
y = np.array([1.,3.,2.,4.,5.])

x_mean = np.mean(x)
y_mean = np.mean(y)

num = 0.0
d = 0.0
for x_i, y_i in zip(x,y):
    num += (x_i - x_mean)*(y_i - y_mean)
    d += (x_i - x_mean)**2
    
a = num/d
b = y_mean - a * x_mean
y_hat = a * x + b

plt.scatter(x,y)
plt.plot(x,y_hat,color =  'r')
plt.axis([0,6,0,6])
plt.show()

自己封装线性回归算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#SimpleLinearRegression.py
import numpy as np
from metrics import r2_score


class SimpleLinearRegression:

    def __init__(self):
        """初始化Simple Linear Regression模型"""
        self.a_ = None
        self.b_ = None

    def fit(self, x_train, y_train):
        """根据训练数据集x_train, y_train训练Simple Linear Regression模型"""
        assert x_train.ndim == 1, \
            "Simple Linear Regressor can only solve single feature training data."
        assert len(x_train) == len(y_train), \
            "the size of x_train must be equal to the size of y_train"

        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)

        self.a_ = (x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean)
        self.b_ = y_mean - self.a_ * x_mean

        return self

    def predict(self, x_predict):
        """给定待预测数据集x_predict,返回表示x_predict的结果向量"""
        assert x_predict.ndim == 1, \
            "Simple Linear Regressor can only solve single feature training data."
        assert self.a_ is not None and self.b_ is not None, \
            "must fit before predict!"

        return np.array([self._predict(x) for x in x_predict])

    def _predict(self, x_single):
        """给定单个待预测数据x,返回x的预测结果值"""
        return self.a_ * x_single + self.b_

    def score(self, x_test, y_test):
        """根据测试数据集 x_test 和 y_test 确定当前模型的准确度"""

        y_predict = self.predict(x_test)
        return r2_score(y_test, y_predict)

    def __repr__(self):
        return "SimpleLinearRegression()"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from SimpleLinearRegression import SimpleLinearRegression

reg = SimpleLinearRegression()
reg.fit(x,y)
# SimpleLinearRegression()
reg.predict(np.array([x_predict]))
# array([5.7])
y_hat = reg.predict(x)
plt.scatter(x,y)
plt.plot(x,y_hat,color='g')
plt.axis([0,6,0,6])
plt.show()

衡量回归算法的标准

对于上述算法中,要求找到ab,使得损失函数\sum\limits_{i=1}^{m}(y_{train}^{(i)}-ax_{train}^{(i)}-b)^2,尽可能小,等价于使得\sum\limits_{i=1}^{m}(y_{train}^{(i)}-\hat{y}_{train}^{(i)})^2尽可能小,那么我们是否也可以用\sum\limits_{i=1}^{m}(y_{test}^{(i)}-\hat{y}_{test}^{(i)})^2作为衡量回归算法的标准呢,仔细一想这样是不行的,这种计算方式与m的相关性很大,由此我们推出了其他几种误差的计算方法,主要有以下几个

均方误差MSE(Mean Squared Error)

\frac{1}{m}\sum\limits_{i=1}^m(y_{test}^{(i)}-\hat{y}_{test}^{(i)})^2

均方根误差RMSE(Root Mean Squared Error)

\sqrt{\frac{1}{m}\sum\limits_{i=1}^m(y_{test}^{(i)}-\hat{y}_{test}^{(i)})^2}=\sqrt{MSE_{test}}

平均绝对误差MAE(Mean Absolute Error)

\frac{1}{m}\sum_{i=1}^m\vert y_{test}^{(i)}-\hat{y}_{test}^{(i)}\vert

R Squared

R^2=1-\frac{SS_{residual}}{SS_{total}}=1-\frac{\sum\limits_i(\hat{y}^{(i)}-y^{(i)})^2}{\sum\limits_i(\overline{y}-y^{(i)})^2}

其中SS_{residual}表示Residual Sum of Squares,SS_{total}表示Total Sum of Squares,这个评价方法也是scikit-learn中线性回归算法中score方法调用的评价指标。对于\sum\limits_i(\hat{y}^{(i)}-y^{(i)})^2我们可以理解成使用我们的模型预测产生的错误,对于\sum\limits_i(\overline{y}-y^{(i)})^2可以理解为使用y=\overline{y}预测产生的错误,有以下几点需要清楚:

  • 对于R^2来说,总是小于等于1的
  • R^2越大越好,当模型预测不犯任何错误时,R^2=1
  • 当我们的模型等于基准模型时,R^2=0
  • 如果R^2<0

另外,可以推导得到R SquaredMSE和方差之间的关系

R^2=1-\frac{\sum\limits_i(\hat{y}^{(i)}-y^{(i)})^2}{\sum\limits_i(\overline{y}-y^{(i)})^2}=1-\frac{(\sum\limits_{i=1}^m(\hat{y}^{(i)}-y^{(i)})^2)/m}{(\sum\limits_{i=1}^m(y^{(i)}-\overline{y})^2)/m}=1-\frac{MSE(\hat{y},y)}{Var(y)}

以波士顿房价数据为例对线性回归结果进行评价

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn import datasets
boston = datasets.load_boston()
x = boston.data[:,5]  #只使用房间数量这个特征
x.shape
# (506,)
y = boston.target

plt.scatter(x,y)
plt.show()

发现存在边界值,需要对其进行清除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 去掉边界点
x = x[y<50.0]
y = y[y<50.0]
plt.scatter(x,y)
plt.show()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 使用自己封装的两个函数
from model_selection import train_test_split
from SimpleLinearRegression import SimpleLinearRegression

x_train,x_test,y_train,y_test = train_test_split(x,y,seed = 666)
reg =  SimpleLinearRegression()
reg.fit(x_train,y_train)
y_predict = reg.predict(x_test)
plt.scatter(x_train,y_train)
plt.plot(x_train,reg.predict(x_train),color='r')
plt.show()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# MSE
mse_test = np.sum((y_predict - y_test)**2) / len(y_test)
# 24.156602134387438

# RMSE
from math import sqrt
rmse_test = sqrt(mse_test)
# 4.914936635846635

# MAE
mae_test = np.sum(np.absolute(y_predict - y_test) / len(y_test))
# 3.543097440946387

# R square
r_square = 1 - mean_squared_error(y_test,y_predict) / np.var(y_test)
# 0.6129316803937322

# 也可以使用scikit-learn中的函数来计算MSEMAE
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
mean_squared_error(y_test,y_predict)
# 24.156602134387438
mean_absolute_error(y_test,y_predict)
3.5430974409463873
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
1
1
回复回复点赞举报
推荐阅读
vue学习:使用tab标签页时,刷新页面停留在当前tab
可以看到 <el-tabs> 标签中 v-model="activeName",它和选项卡中的 name属性进行绑定;
冰霜
2022/04/18
3.9K0
vue学习:使用tab标签页时,刷新页面停留在当前tab
Vue页面中引用自定义组件
比如我想引用一个外部的头部导航的组件,因为这个导航在很多地方都用到,避免每个页面都写一遍 首先 我先在components这里创建一个navmenu的组件
明知山
2020/09/03
1.5K0
Element Tabs 标签页实现右键自定义菜单
如果tab标签页比较多的话,一个个关闭比较麻烦,可以右键显示菜单,关闭所有的标签页或者特定的标签页
tianyawhl
2020/04/13
4.2K0
element-ui 标签页(循环遍历)
---- <div class="box3"> <el-tabs v-model="activeName" @tab-click="handleClick"> <el-tab-pane :label="textShow + '默认'" name="first">用户管理</el-tab-pane> <el-tab-pane label="配置管理" name="second">配置管理</el-tab-pane> <el-tab-pane la
用户4344670
2019/08/28
5.6K0
element-ui 标签页(循环遍历)
vue 点击菜单动态生成Tab
UI 组件采用element  NavMenu点击左侧的菜单列表生成Tab,如下图
tianyawhl
2020/02/20
4.5K2
Element Tabs 标签页 展示Echart 并随窗口变化自适应
1、如何在一个div中展示不同的图表  (点击tab时为Chart组件赋值,并传给子组件,子组件监听数据变化并在 $nextTick 中重新绘制表格)
tianyawhl
2020/03/09
2.2K0
Element Tabs 标签页 展示Echart 并随窗口变化自适应
用Spring Boot+Vue做微人事项目第十天
用Spring Boot+Vue做微人事项目第十天
Java架构师必看
2021/05/14
5280
用Spring Boot+Vue做微人事项目第十天
前端成神之路-vue前端项目05
1.完成参数管理 2.推送代码到码云 3.制作商品列表页面 4.制作商品添加页面
海仔
2021/05/06
1.6K0
elementUI中el-tabs或者说Vue现存的一个bug排查
在 el-dialog 中使用 el-tabs ,并且 el-dialog 添加 destroy-on-close 属性,当关闭弹窗的时候页面就直接无响应了。
windliang
2022/09/23
1.4K0
elementUI中el-tabs或者说Vue现存的一个bug排查
动态加载用户菜单
流程是用户登录后进入模块页面,点击不同的模块,进入菜单页面(模块不同,菜单内容也不同)
tianyawhl
2020/02/18
2.4K0
动态加载用户菜单
用例新增、编辑页面
流年Felix
2023/08/28
4350
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》069-商业项目:电商后台管理系统实战(订单管理模块的开发)
在电商行业中,订单管理模块是后台管理系统的核心组成部分之一。它直接关系到商家的运营效率和客户的购物体验。一个高效的订单管理模块不仅能够帮助商家实时追踪订单状态,减少处理时间,还能提升客户满意度,实现更好的业务增长。
愚公搬代码
2025/06/03
1720
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》069-商业项目:电商后台管理系统实战(订单管理模块的开发)
十分钟,让你学会Vue的这些巧妙冷技巧
写了两年的Vue,期间学习到好几个提高开发效率和性能的技巧,现在把这些技巧用文章的形式总结下来。
CRMEB商城源码
2022/07/28
7800
页面中元素的锚点定位
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情 >>
默默的成长
2022/11/02
2.4K0
流程表单的导入导出替换方案--源代码模式
最近要做流程表单的导入导出功能,但总觉得这个功能有点多余。 这个功能只是为了方便迁移配置到环境,为什么需要搞这么复杂呢。 后面想想,觉得没必要这么做,我只作一个源代码示例的功能即可。 意思是说,有一个页面有两个Tab,一个是设计模式,一个是源代码模式。 效果如下:
星痕
2019/10/14
6050
流程表单的导入导出替换方案--源代码模式
【Vue3+TypeScript】CRM系统项目搭建之 — 登录注册页【Tabs 选项卡的搭建以及 Tab 选项组件的插槽的使用】
HelloWorldZ
2024/03/20
3120
【Vue3+TypeScript】CRM系统项目搭建之 — 登录注册页【Tabs 选项卡的搭建以及 Tab 选项组件的插槽的使用】
Vue 根据鼠标悬停目标元素上方显示、隐藏指定元素交互实现
Vue 根据鼠标悬停目标元素上方显示、隐藏指定元素交互实现 By:授客 开发环境 win10 element-ui "2.13.1" vue "2.6.10" 需求描述 如下,鼠标移动到左侧标签
授客
2020/06/23
4K0
10.寻光集后台管理系统-用户管理(登录页面)
把img/logo.png这个图片换一下就可以了,具体路径在frontend/public/img/logo.png
zx钟
2022/12/02
1.2K0
10.寻光集后台管理系统-用户管理(登录页面)
微服务架构 CI/CD 实战
在项目根路径下执行,Maven 命令 mvn clean install -pl com.lab:book-common -am -Ptest,截取输出如下
JAVA日知录
2020/06/04
6530
微服务架构 CI/CD 实战
前端成神之路-vue前端项目04
新建分支goods_cate并推送到码云 git checkout -b goods_cate git push -u origin goods_cate
海仔
2021/05/06
1.8K0
相关推荐
vue学习:使用tab标签页时,刷新页面停留在当前tab
更多 >
目录
  • 算法简介
  • 推导
  • 简单实现
  • 自己封装线性回归算法
  • 衡量回归算法的标准
    • 均方误差MSE(Mean Squared Error)
    • 均方根误差RMSE(Root Mean Squared Error)
    • 平均绝对误差MAE(Mean Absolute Error)
    • R Squared
    • 以波士顿房价数据为例对线性回归结果进行评价
加入讨论
的问答专区 >
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档