有监督学习——线性回归

news2025/2/26 13:51:18

1. 线性模型

有监督学习是通过已知的样本产生预测模型的学习方法,任何有监督学习模型都可被想象成一个函数:

在这里插入图片描述

其中,\(x_1,x_2,x_3…x_n\)是模型的n维的特征值,\(y\)是要预测的目标值/分类,当\(y\)是可枚举的类型时,对应分类问题(classification);\(y\)为连续值时,该模型解决回归问题(regression)。

线性回归(Linear Regression)在机器学习中被用来解决学习特征和目标值都是连续值类型的问题,可定义为多项式函数:

在这里插入图片描述

线性模型学习的目标就是确定\(w_0 w_1…w_n\)的值,使\(y\)可以根据特征值直接通过函数计算得到,\(w_0\)成为截距,\(w_1…w_n\)被成为回归系数(coefficient)。

公式(2)可以有其他变体,注意:是否是线性模型取决于其被要求的系数\(w_0…w_n\)之间是否为线性关系,与样本特征变量\(x_0…x_n\)的形式无关。e.g.以下前者为线性模型,后者为非线性模型。

在这里插入图片描述

2. 最小二乘法

最简单的线性模型算法便是最小二乘法(Ordinary Least Squares, OLS),通过样本真值与预测值之间的方差和来达到计算出\(w_1,w_2…w_n\)的目的,即:

在这里插入图片描述

arg min就是使后面这个式子达到最小值时的变量的取值,其中\(\hat{y}\)是样本预测值,\(y\)是样本中的真值(ground truth)

在python使用

import numpy as np
from sklearn import linear_model

x = np.array([[0, 1], [3, -2], [2, 3]]) # 训练样本特征
y = np.array([0.5, 0.3, 0.9])   # 训练样本目标值

reg = linear_model.LinearRegression()  # 最小二乘法回归对象
reg.fit(x, y)   # 训练、拟合

print("intercept_:", reg.intercept_)    # 读取截距
# intercept_: 0.36666666666666686

print("coef_:", reg.coef_)  # 读取回归参数
# coef_: [0.06666667 0.13333333]

reg.predict([[1, 2], [-3, 9]]) # 预测
# array([0.7       , 1.36666667])

通过intercept_coef_属性可知道上述代码拟合的线性模型为:

在这里插入图片描述

最小二乘的不足

随着特征维度的增加,模型的求得的参数\(w_0 w_2…w_n\)的值显著增加,OLS始终试图最小化公式的值,因此为了拟合训练数据中很小的\(x\)的值差异产生的较大\(y\)值差异,必须使用较大的\(w\)值,结果是任何一个微小的变化都会导致最终预测目标值大幅度变化,即过拟合。请看:

# 测试数据
def make_data(nDim):
    x0 = np.linspace(1, np.pi, 50)  # 一个维度的特征
    x = np.vstack([[x0,], [i**x0 for i in range(2, nDim+1)]])   # nDim个维度的特征
    y = np.sin(x0) + np.random.normal(0, 0.15, len(x0)) # 目标值
    return x.transpose(), y
x, y = make_data(12)

使用最小二乘法拟合:

def linear_regression():
    dims = [1,3,6,12]   # 需要训练的维度
    for idx, i in enumerate(dims):
        plt.subplot(2, int(len(dims)/2), idx+1)
        reg = linear_model.LinearRegression()

        sub_x = x[:, 0:i]   # 取x中前i个维度的特征
        reg.fit(sub_x, y)   # 训练
        plt.plot(x[:,0], reg.predict(sub_x))    # 绘制模型
        plt.plot(x[:,0], y, '.')
        plt.title("dim %s"%i)

        print("dim %d :"%i)
        print("intercept_: %s"%(reg.intercept_))    # 查看截距参数
        print("coef_: %s"%(reg.coef_))  # 查看回归参数
    plt.show()

linear_regression()
## 输出
# dim 1 :
# intercept_: 1.5190767802159115
# coef_: [-0.39131134]
# dim 3 :
# intercept_: 1.1976858427101735
# coef_: [ 1.91353693 -1.39387114  0.16182502]
# dim 6 :
# intercept_: -221.70126917849046
# coef_: [-104.46259453  520.30421899 -573.61812163  429.72658285 -181.37364277
#    32.5448376 ]
# dim 12 :
# intercept_: -7992016.158635169
# coef_: [-1.83126880e+06  5.87461130e+07 -2.99765476e+08  9.72248992e+08
#  -1.92913886e+09  2.18748658e+09 -8.81323910e+08 -1.12973621e+09
#   2.01475457e+09 -1.40758872e+09  4.94058411e+08 -7.17485861e+07]

在这里插入图片描述

可以明显看到dim=12已经过拟合了

3. 岭回归

岭回归(Ridge Regression 或称Tikhonov Regularization)由俄罗斯科学家Tikhonov提出,通过改变回归目标系数,达到了控制回归参数随着维度疯狂增长的目的。新的回归函数:

在这里插入图片描述

OLS的差别在于将\(\alpha\sum w^2\)加入最小化目标(也被称为L2惩罚项,即L2 Penalty),其中\(\alpha\)是一个可调节的超参数,\(w\)是线性模型中的所有参数。

Ridge与原来的LinearRegression类使用方法相似,只是在初始化对象需要超参数α

def ridge_regression():
    alphas = [1e-15, 1e-12, 1e-5, 1, ]      # α参数

    for idx, i in enumerate(alphas):
        plt.subplot(2, int(len(alphas)/2), idx+1)
        reg = linear_model.Ridge(alpha=i)  # 岭回归模型

        sub_x = x[:, 0:12]   # 取x中前i个维度的特征
        reg.fit(sub_x, y)   # 训练
        plt.plot(x[:,0], reg.predict(sub_x))    # 绘制模型
        plt.plot(x[:,0], y, '.')
        plt.title("dim=12, alpha=%e"%i)

        print("alpha %e :"%i)
        print("intercept_: %s"%(reg.intercept_))    # 查看截距参数
        print("coef_: %s"%(reg.coef_))  # 查看回归参数
    plt.show()
ridge_regression()
#输出结果
# dim 1 :
# intercept_: 1.5190767802159115
# coef_: [-0.39131134]
# dim 3 :
# intercept_: 1.1976858427101735
# coef_: [ 1.91353693 -1.39387114  0.16182502]
# dim 6 :
# intercept_: -221.70126917849046
# coef_: [-104.46259453  520.30421899 -573.61812163  429.72658285 -181.37364277
#    32.5448376 ]
# dim 12 :
# intercept_: -7992016.158635169
# coef_: [-1.83126880e+06  5.87461130e+07 -2.99765476e+08  9.72248992e+08
#  -1.92913886e+09  2.18748658e+09 -8.81323910e+08 -1.12973621e+09
#   2.01475457e+09 -1.40758872e+09  4.94058411e+08 -7.17485861e+07]

在这里插入图片描述

比较OLS模型的12维结果,模型参数\(w\)显著降低。并且\(\alpha\)参数大小与训练结果成反比:\(\alpha\)越大,回归参数越小,模型越平缓。

3. Lasso回归

Ridge已经可以解决了多特征情况下参数太大导致的过度拟合,但在该模型中,无论\(\alpha\)多大,回归模型都存在绝对值极小的参数,难以到达零值,这部分参数对最终预测结果影响甚微但消耗计算资源,因此需要将不重要的特征参数计算为零,即压缩特征。这便是Lasso回归:

在这里插入图片描述

对上面的代码略作修改

def lasso_regression():
    alphas = [1e-12, 1e-5, 1, 10]      # α参数

    for idx, i in enumerate(alphas):
        plt.subplot(2, int(len(alphas)/2), idx+1)
        reg = linear_model.Lasso(alpha=i)  # Lasso模型

        sub_x = x[:, 0:12]   # 取x中前12个维度的特征
        reg.fit(sub_x, y)   # 训练
        plt.plot(x[:,0], reg.predict(sub_x))    # 绘制模型
        plt.plot(x[:,0], y, '.')
        plt.title("dim=12, alpha=%e"%i)

        print("alpha %e :"%i)
        print("intercept_: %s"%(reg.intercept_))    # 查看截距参数
        print("coef_: %s"%(reg.coef_))  # 查看回归参数
    plt.show()
lasso_regression()
## 输出
# alpha 1.000000e-12 :
# intercept_: 0.6298258513945978
# coef_: [ 1.22542814e+00 -4.54947716e-01 -3.93085543e-02 -5.49725917e-03
#  -5.88010501e-04  2.47220823e-04  3.36442748e-04  2.85372733e-04
#   2.20237636e-04  1.66111569e-04  1.25225041e-04  9.51371122e-05]
# alpha 1.000000e-05 :
# intercept_: 0.6275025198172812
# coef_: [ 1.21848162e+00 -4.48693464e-01 -4.01246675e-02 -5.58492834e-03
#  -6.02833485e-04  2.41969131e-04  3.37470151e-04  2.86500656e-04
#   2.21159502e-04  1.66823390e-04  1.25767364e-04  9.55513093e-05]
# alpha 1.000000e+00 :
# intercept_: 0.9304502324995079
# coef_: [-0.00000000e+00 -0.00000000e+00 -0.00000000e+00 -0.00000000e+00
#  -0.00000000e+00 -0.00000000e+00 -0.00000000e+00 -0.00000000e+00
#  -0.00000000e+00 -6.76060251e-04 -7.30714077e-05 -0.00000000e+00]
# alpha 1.000000e+01 :
# intercept_: 0.9076753246287685
# coef_: [-0.        -0.        -0.        -0.        -0.        -0.
#  -0.        -0.        -0.        -0.        -0.        -0.0004185]

在这里插入图片描述

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1823764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode--字母异位词分组】

class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:np collections.defaultdict(list)for st in strs:name "".join(sorted(st))np[name].append(st)return list(np.values()) collections.defaultdict(list)创建字典类型&#xff…

给你一个扫码支付的二维码,如何写测试用例?

前言 面试的时候,经常会临场出题:给你一个xxx, 如何测试, 或者说如何写测试用例?xxx可以是圆珠笔,水杯,电梯等生活中常见的场景。 那么给你一个支付的二维码,如何写测试用例呢? 二维码扫码支…

Vue路由守卫的使用

示例如下:(第一张图)当你点击车1的时候你写了路由守卫就点不开出现无权访问 (第二张图,就是可以访问后的图)有路由守卫点不开的情况下当你在本地存储中写了你在路由守卫中写的东西就可以进入了 你需要在r…

材料科学SCI期刊,中科院3区,IF=3.8,专业性强

一、期刊名称 Materials Today Communications 二、期刊简介概况 期刊类型:SCI 学科领域:材料科学 影响因子:3.8 中科院分区:3区 三、期刊征稿范围 《今日材料通讯》是一本范围广泛、多学科、快速出版的期刊,专注…

【docker】Dockerfile制作基础镜像 python 底层镜像制作 | 打包所有的requirement依赖

一、Dockerfile思想 我们正常的对一个项目进行打包 docker image 通常是在CI工具编译时进行对依赖的安装,比如golang的go get、python的pip install、node的npm install 等等 好处:我们更新了依赖可以动态的再编译时进行一个对依赖的更新 坏处&#xf…

Spring 内置BeanFactoryPostProcessor的子孙们

同样的Spring 也 内置了 一些实现 BeanFactoryPostProcessor的类,各有各的用处。 spring-context AspectJWeavingEnabler 用来把ClassPreProcessorAgentAdapter注册到LoadTimeWeaver中ConfigurationClassPostProcessor 一个重要的类,用来处理Configurat…

Redis应用:基于Redis实现排行榜、点赞、关注功能

文章目录 1. 环境准备2. 实现排行榜功能2.1 添加用户分数2.2 获取排行榜2.3 获取用户排名2.4 更新用户分数示例代码3. 实现点赞功能3.1 添加点赞3.2 获取点赞数3.3 检查用户是否点赞3.4 取消点赞示例代码4. 实现关注功能4.1 添加关注4.2 获取粉丝列表4.3 获取关注列表4.4 取消关…

【区间合并 差分 栈】3169. 无需开会的工作日

本文涉及知识点 区间合并 差分数组(大约2024年7月1号发) LeetCode3169. 无需开会的工作日 给你一个正整数 days,表示员工可工作的总天数(从第 1 天开始)。另给你一个二维数组 meetings,长度为 n,其中 me…

简易五子棋

简介 使用Java实现简易五子棋 规则介绍 游戏使用一个标准的1515方格的棋盘,双方分别用黑白两种颜色的棋子进行对战。黑子先行,双方轮流在空棋盘的交叉点上落子,每人一次只能落一子。游戏的目标是让自己的五颗棋子连成一线,这条…

BSCI验厂是什么?

BSCI验厂是指Business Social Compliance Initiative,即倡议商界遵守社会责任组织对BSCI组织成员的全球供应商进行的社会责任审核。以下是对BSCI验厂的详细介绍: 背景介绍: 2003年3月,总部设在比利时布鲁塞尔的对外贸易协会FTA正式…

618网络机顶盒哪个牌子好?内行盘点网络机顶盒排行榜

因工作原因每天都在跟各种类型的网络机顶盒打交道,最近超多朋友问我网络机顶盒哪个牌子好,不知道如何挑选网络机顶盒,我将要分享目前最值得入手的网络机顶盒排行榜,想买网络机顶盒可以看看以下这些品牌: ★泰捷WEBOX 6…

在ubuntu16中下载VMware Tools工具

一、打开植入 二、开始安装 打开驱动放置的默认位置 在这里打开终端;添加到/home/你的用户名/Downloand/中 进入后解压 然后进去解压后的文件 终端输入 sudo ./vmware-install.pl 开始安装前的配置(很麻烦跟着输就行) 继续 出现如上…

机器学习笔记:focal loss

1 介绍 Focal Loss 是一种在类别不平衡的情况下改善模型性能的损失函数最初在 2017 年的论文《Focal Loss for Dense Object Detection》中提出这种损失函数主要用于解决在有挑战性的对象检测任务中,易分类的负样本占据主导地位的问题,从而导致模型难以…

蓝牙耳机怎么连接电脑?轻松实现无线连接

蓝牙耳机已经成为许多人生活中不可或缺的一部分,不仅可以方便地连接手机,还能轻松连接电脑,让我们在工作和娱乐时享受无线的自由。然而,对于一些用户来说,将蓝牙耳机与电脑连接可能会遇到一些问题。本文将介绍蓝牙耳机…

JAVA面试常见面试问题02

1、jvm 内存结构图 对jvm直观的了解 答: jvm是一个抽象执行环境,它通过加载字节码、实现跨平台运行、管理内存(包括自动垃圾回收)、优化代码执行等,为Java程序提供运行时支持 2、内存泄漏 和 内存溢出 答&#xf…

错题记录(小测)

单选 错题1 错题2 错题3 代码题 反转链表 链表的回文结构

C++语法08 数据类型之间的强制转换

目录 强制类型转换 强制类型转换格式 整型转换成浮点型 整型转换成浮点型其他写法 训练:糖果奖励 糖果奖励参考代码 浮点型转换成整型 浮点型转换成整型其他写法 训练:分离小数 分离小数参考代码 强制类型转换 强制类型转换,就是把…

碳中和研究院OLED透明屏2x2整机项目方案

一、项目背景 随着全球气候变化和环境问题的日益严重,碳中和成为各国政府和企业的重要议题。为了响应这一趋势,黑龙江碳中和研究院计划引入先进的OLED透明屏技术,以展示其研究成果和碳中和理念。本项目旨在为该研究院提供一套高质量的OLED透明…

域策略笔记

域策略 导航 文章目录 域策略导航一、设置客户端壁纸二、重定向用户配置文件路径三、部署网络打印机四、部署共享文件夹为网络驱动器五、通过域策略推送软件安装六、通过域策略限制软件的使用通过路径进行限制通过进程限制 七、通过域策略将文件添加白名单八、通过域策略添加可…

什么是 Solana 节点?

什么是 Solana 节点? 验证交易和维护安全是任何项目进入权益证明领域时必须执行的强制性活动。如果没有节点运营商(验证器和 RPC 节点),Solana 网络就无法实现这些目标。 让我们看看这两种类型的节点有何区别。 共识验证者 角色&…