线性回归,核技巧和线性核

news2025/1/18 8:44:35

在这篇文章中,我想展示一个有趣的结果:线性回归与无正则化的线性核ridge回归是等 价的。

这里实际上涉及到很多概念和技术,所以我们将逐一介绍,最后用它们来解释这个说法。

首先我们回顾经典的线性回归。然后我将解释什么是核函数和线性核函数,最后我们将给出上面表述的数学证明。

线性回归

经典的-普通最小二乘或OLS-线性回归是以下问题:

Y是一个长度为n的向量,由线性模型的目标值组成

β是一个长度为m的向量:这是模型必须“学习”的未知数。

X是形状为n行m列的数据矩阵。我们经常说我们有n个向量记录在m特征空间中

我们的目标是找到使平方误差最小的值

这个问题实际上有一个封闭形式的解,被称为普通最小二乘问题。解决方案是:

一旦解已知,就可以使用拟合模型计算新的y值给定新的x值,使用:

让我们用scikit-learn来验证我上面的数学理论:使用sklearn线性回归器,以及基于numpy的回归

 %matplotlib qt
 import numpy as np
 import matplotlib.pyplot as plt
 from sklearn.linear_model import LinearRegression
 
 np.random.seed(0)
 n = 100
 X_ = np.random.uniform(3, 10, n).reshape(-1, 1)
 beta_0 = 2
 beta_1 = 2
 true_y = beta_1 * X_ + beta_0
 noise = np.random.randn(n, 1) * 0.5 # change the scale to reduce/increase noise
 y = true_y + noise
 
 fig, axes = plt.subplots(1, 2, squeeze=False, sharex=True, sharey=True, figsize=(18, 8))
 axes[0, 0].plot(X_, y, "o", label="Input data")
 axes[0, 0].plot(X_, true_y, '--', label='True linear relation')
 axes[0, 0].set_xlim(0, 11)
 axes[0, 0].set_ylim(0, 30)
 axes[0, 0].legend()
 
 # f_0 is a column of 1s
 # f_1 is the column of x1
 X = np.c_[np.ones((n, 1)), X_]
 
 beta_OLS_scratch = np.linalg.inv(X.T @ X) @ X.T @ y
 lr = LinearRegression(
     fit_intercept=False, # do not fit intercept independantly, since we added the 1 column for this purpose
 ).fit(X, y)
 
 new_X = np.linspace(0, 15, 50).reshape(-1, 1)
 new_X = np.c_[np.ones((50, 1)), new_X]
 new_y_OLS_scratch = new_X @ beta_OLS_scratch 
 new_y_lr = lr.predict(new_X)
 axes[0, 1].plot(X_, y, 'o', label='Input data')
 axes[0, 1].plot(new_X[:, 1], new_y_OLS_scratch, '-o', alpha=0.5,  label=r"OLS scratch solution")
 axes[0, 1].plot(new_X[:, 1], new_y_lr, '-*', alpha=0.5, label=r"sklearn.lr OLS solution")
 axes[0, 1].legend()
 fig.tight_layout()
 print(beta_OLS_scratch)
 print(lr.coef_)

可以看到,2种方法的结果是相同的

 [[2.12458946]
  [1.99549536]]
 [[2.12458946 1.99549536]]

这两种方法给出了相同的结果

核技巧 Kernel-trick

现在让我们回顾一种称为内核技巧的常用技术。

我们最初的问题(可以是任何类似分类或回归的问题)存在于输入数据矩阵X的空间中,在m个特征空间中有n个向量的形状。有时在这个低维空间中,向量不能被分离或分类,所以我们想要将输入数据转换到高维空间。可以手工完成,创建新特性。但是随着特征数量的增长,数值计算也将增加。

核函数的技巧在于使用设计良好的变换函数——通常是T或——从一个长度为m的向量x创建一个长度为m的新向量x ',这样我们的新数据具有高维数,并且将计算负荷保持在最低限度。

为了达到这个目的,函数必须满足一些性质,使得新的高维特征空间中的点积可以写成对应输入向量的函数——核函数:

这意味着高维空间中的内积可以表示为输入向量的函数。也就是说我们可以在高维空间中只使用低维向量来计算内积。这就是核技巧:可以从高维空间的通用性中获益,而无需在那里进行任何计算。

唯一的条件是我们只需要在高维空间中做点积。

实际上有一些强大的数学定理描述了产生这样的变换和/或这样的核函数的条件。

以下是一个核函数示例:

kernel从m维空间创建m^2维空间的第一个例子是使用以下代码:

在核函数中添加一个常数会增加维数,其中包含缩放输入特征的新特征:

下面我们要用到的另一个核函数是线性核函数:

所以恒等变换等价于用一个核函数来计算原始空间的内积。

实际上还有很多其他有用的核,比如径向核(RBF)核或更一般的多项式核,它们可以创建高维和非线性特征空间。我们这里再简单介绍一个在线性回归环境中使用RBF核计算非线性回归的例子:

 import numpy as np
 from sklearn.kernel_ridge import KernelRidge
 import matplotlib.pyplot as plt
 
 np.random.seed(0)
 X = np.sort(5 * np.random.rand(80, 1), axis=0)
 y = np.sin(X).ravel()
 y[::5] += 3 * (0.5 - np.random.rand(16))
 
 # Create a test dataset
 X_test = np.arange(0, 5, 0.01)[:, np.newaxis]
 
 # Fit the KernelRidge model with an RBF kernel
 kr = KernelRidge(
     kernel='rbf', # use RBF kernel
     alpha=1, # regularization 
     gamma=1, # scale for rbf
 )
 kr.fit(X, y)
 
 y_rbf = kr.predict(X_test)
 
 # Plot the results
 fig, ax = plt.subplots()
 ax.scatter(X, y, color='darkorange', label='Data')
 ax.plot(X_test, y_rbf, color='navy', lw=2, label='RBF Kernel Ridge Regression')
 ax.set_title('Kernel Ridge Regression with RBF Kernel')
 ax.legend()

线性回归中的线性核

如果变换将x变换为(x)那么我们可以写出一个新的线性回归问题

注意维度是如何变化的:线性回归问题的输入矩阵从[nxm]变为[nxm '],因此系数向量从长度m变为m '。

这就是核函数的诀窍:当计算解’时,注意到X '与其转置的乘积出现了,它实际上是所有点积的矩阵,它被称为核矩阵

线性核化和线性回归

最后,让我们看看这个陈述:在线性回归中使用线性核是无用的,因为它等同于标准线性回归。

线性核通常用于支持向量机的上下文中,但我想知道它在线性回归中的表现。

为了证明这两种方法是等价的,我们必须证明:

使用beta的第一种方法是原始线性回归,使用beta '的第二种方法是使用线性核化方法。我们可以用上面的矩阵性质和关系来证明这一点:

我们可以使用python和scikit learn再次验证这一点:

 %matplotlib qt
 import numpy as np
 import matplotlib.pyplot as plt
 from sklearn.linear_model import LinearRegression
 
 np.random.seed(0)
 n = 100
 X_ = np.random.uniform(3, 10, n).reshape(-1, 1)
 beta_0 = 2
 beta_1 = 2
 true_y = beta_1 * X_ + beta_0
 noise = np.random.randn(n, 1) * 0.5 # change the scale to reduce/increase noise
 y = true_y + noise
 
 fig, axes = plt.subplots(1, 2, squeeze=False, sharex=True, sharey=True, figsize=(18, 8))
 axes[0, 0].plot(X_, y, "o", label="Input data")
 axes[0, 0].plot(X_, true_y, '--', label='True linear relation')
 axes[0, 0].set_xlim(0, 11)
 axes[0, 0].set_ylim(0, 30)
 axes[0, 0].legend()
 
 # f_0 is a column of 1s
 # f_1 is the column of x1
 X = np.c_[np.ones((n, 1)), X_]
 
 beta_OLS_scratch = np.linalg.inv(X.T @ X) @ X.T @ y
 lr = LinearRegression(
     fit_intercept=False, # do not fit intercept independantly, since we added the 1 column for this purpose
 ).fit(X, y)
 
 new_X = np.linspace(0, 15, 50).reshape(-1, 1)
 new_X = np.c_[np.ones((50, 1)), new_X]
 new_y_OLS_scratch = new_X @ beta_OLS_scratch 
 new_y_lr = lr.predict(new_X)
 axes[0, 1].plot(X_, y, 'o', label='Input data')
 axes[0, 1].plot(new_X[:, 1], new_y_OLS_scratch, '-o', alpha=0.5,  label=r"OLS scratch solution")
 axes[0, 1].plot(new_X[:, 1], new_y_lr, '-*', alpha=0.5, label=r"sklearn.lr OLS solution")
 axes[0, 1].legend()
 fig.tight_layout()
 print(beta_OLS_scratch)
 print(lr.coef_)

总结

在这篇文章中,我们回顾了简单线性回归,包括问题的矩阵公式及其解决方案。

然后我们介绍了了核技巧,以及它如何允许我们从高维空间中获益,并且不需要将低维数据实际移动到这个计算密集型空间。

最后,我证明了线性回归背景下的线性核实际上是无用的,它对应于简单的线性回归。

https://avoid.overfit.cn/post/2717f8bc35e444e28afc9ffc7e988f13

作者:Yoann Mocquin

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

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

相关文章

阿里云配置ECS实例的IPv6地址,开通公网IPv6

1.阿里云ECS服务器开通IPv6地址,开通公网IPv6 1.1.官网教程 配置ECS实例的IPv6地址 1.2.相关截图 1 2 3 4 5 6

函数的连续性

函数在某一点极限存在,不一定连续 函数的左极限 函数的右极限 函数在某点连续需要满足三个条件 1、左右极限存在 2、左右极限相等 3、函数在该点的极限值等于在该点的函数值 满足1、2两个条件函数在该点极限存在。

Shopee的折扣活动怎么分类?shopee设置折扣注意事项

旺季到来,Shopee会举办一些折扣活动来吸引客户,那么shopee的折扣活动怎么分类,shopee设置折扣注意事项? shopee的折扣活动怎么分类? 满减活动:满减活动是虾皮常见的一种折扣形式。在这种活动中&#xff0…

一个轻量级 Java 权限认证框架——Sa-Token

一、框架介绍 Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 官网文档: https://sa-token.cc/doc.html 二、Spring Boot 集成Sa-Token 2.1、…

【网络开发必看】聊聊 Tomcat

文章目录 1. 什么是 Tomcat2. 怎么安装 Tomcat3. Tomcat 的目录结构3.1 bin 目录3.2 conf 目录3.3 lib 目录3.4 log 目录3.5 webapps 目录 4. 启动 Tomcat总结 1. 什么是 Tomcat Tomcat 是一个 HTTP 服务器. 前面学习了 HTTP 协议, 知道了 HTTP 协议就是规定 HTTP 客户端和 HT…

【C++】类型转换 | IO流 | 空间配置器

C语言类型转换 C语言总共有两种形式的类型转换:隐式类型转换 和 显示类型转换。 C语言的转换格式虽然很简单,但也存在不少缺陷: 隐式类型转换有些情况下可能会引发意料之外的结果,比如数据精度丢失。显示类型转换的可视性比较差…

MYSQL操作详解

一)计算机的基本结构 但是实际上,更多的是这种情况: 二)MYSQL中的数据类型: 一)数值类型: 数据类型内存大小(字节)说明bit(M)M指定位数,默认为1单个二进制位值,或者为0或者为1,主要用于开/关标志tinyint1字节1个字节的整数值,支持…

iPad系列将在2024年全面更新!

今年还会有新iPad发布吗?答案是否定的。因为早在前几天的季度电话会议上,苹果公司CEO蒂姆・库克就已经宣布,今年不会推出任何新的iPad产品。 这也意味着,今年将是苹果公司自2010年推出首款iPad设备以来,第一次没有发布…

【LeetCode刷题日志】138.随机链表的复制

🎈个人主页:库库的里昂 🎐C/C领域新星创作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:LeetCode 刷题日志🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,…

穿越内存迷宫:C语言地址与指针的的冒险之旅

前言 C语言的魅力在于其直接的内存控制,而地址和指针是这种控制的核心。深入了解这些概念,将帮助我们更好地理解和利用C语言的潜力。本文将带领你踏上地址与指针的奇妙之旅,揭示它们在程序设计中的神秘面纱。 奇妙指针之旅:解码…

好物周刊#30:Github 上大学

https://github.com/cunyu1943/JavaPark https://yuque.com/cunyu1943 村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。 一、项目 1. Fighting Design 一款灵活、优质的组件库,可在 vue3 应用程…

C语言 音乐播放器项目(综合)

1.main.c文件 #include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h>//休眠所需的头文件 #include "./pos/console.h"//光标使用所需的头文件 #include "lrc.h" #include "./mplayer/start_mplayer…

让你的win10/win11系统变得不再卡顿,优雅草伊凡整理-长期更新-如何让windows操作系统不用老是重装在不断的更新中依然保持流畅运行

概述 如题&#xff1a;让你的win10/win11系统变得不再卡顿&#xff0c;优雅草伊凡整理-长期更新-如何让windows操作系统不用老是重装在不断的更新中依然保持流畅运行 本文长期更新&#xff0c;本次更新2023年11月8日&#xff01; 很多时候 我们的win10win11系统不管再怎么关…

基于SSM的软考系统设计实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Servlet作业小练习

一.题目 利用JavaBean实现用户类&#xff0c;包含姓名、性别、爱好&#xff0c;爱好需要用多选框 实现表单1进行获取数据&#xff0c;表单2显示获取结果。 利用Servlet实现逻辑代码 二.实现效果 三.具体实现 1.User实体类 package com.hjj.pojo;/*** author:嘉佳 Date:20…

【蓝桥杯软件赛 零基础备赛20周】第3周——填空题

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 文章目录 00. 2023年第14届参赛数据0. 上一周答疑1. 填空…

环境变量小节

这是写的第二篇环境变量博客&#xff0c;写了一年多了&#xff0c;第一次出现把自己博客删了的情况&#xff0c;不知道为什么明明发表了&#xff0c;然后就把草稿箱和回收站的删了&#xff0c;结果晚上发现没发表&#xff0c;回收站删除是无法找回的&#xff0c;以后还是要慎重…

酷柚易汛ERP-账户管理操作指南

1、应用场景 对账户进行管理&#xff0c;可设置账户当前余额、期初余额和设置是否为默认账户。 2、主要操作 2.1 新增支付账户 打开【资料】-【账款管理】&#xff0c;点击【新增】添加账户类别&#xff0c;输入相关信息并保存&#xff0c;账户编号和名称为必录项。&#x…

VirtualBox网络地址转换(NAT),宿主机无法访问虚拟机的问题

问题&#xff1a;NAT模式下&#xff0c;默认只能从内访问外面&#xff0c;而不能从外部访问里面&#xff0c;所以只能单向ping通&#xff0c;虚拟机的ip只是内部ip。 PS&#xff1a;桥接则是与主机公用网卡&#xff0c;有独立的外部ip。 解决&#xff1a;NAT模式可以通过配置 …

最简WebClient 同步、异步调用示例

目录 一&#xff0c;序言二&#xff0c;简单示例1. 引入依赖2. 日志配置3. 调用代码4. 运行结果 三&#xff0c;完整代码 一&#xff0c;序言 WebClient是Spring WebFlux模块提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具&#xff0c;从Spring5.0开始WebClient…