线性回归(一)

线性回归

1.基本术语

①特征:预测所依据的自变量称为特征或协变量

②标签:试图预测的目标称为标签或目标

2.举个栗子

线性假设是指目标(房屋价格)可以表示为特征(面积和房龄)的加权和,如下面的式子:

绘制图像如下图所示:

可知平面无法拟合所有的数据点,所以需求变成让尽可能多的点落在平面上,这个需要权重和偏置项来调整平面位置和倾斜度。

③权重决定了每个特征对我们预测值的影响

④偏置是指当所有特征都取值为0时,预测值应该为多少,对图像进行平移功能。

常见的为点积形式:

整合2.1.2式子可得

(2.1.3)

⑤误差(损失函数)

量化实际值与预测值之间存在的差距(用ε表示该误差)

对于每个样本存在该式:

(2.1.4)

(真实值=预测值+误差项),误差值越小表示损失越小。

误差ε是独立并且具有相同的分布,并且服从均值为0方差为θ^2的高斯分布。独立表示一个变量的值不会影响另一个变量的值,同分布表示具有相同的统计特性,高斯分布:绝大多数情况下浮动不会太大,极小情况下浮动会比较大,符合正常情况

由于误差服从高斯分布:

(2.1.5)

将2.1.4代入2.1.5可得:

(2.1.6)

可以找到一个关于θ似然函数:

(2.1.7)

由于我们仅仅关注极值点的位置,并不关注极值的大小,所以可以给两边取对数,就可以将累乘变成累加,得到:

(2.1.8)

由logAB=logA+logB可得:

(2.1.9)

2.1.9公式可以看作是一个常数减去一个平方数的形式,所以要找2.1.9式的极大值,就可以看作找后面平方数的极小值,可得:

当样本i的预测值为y^i,其相应的真实标签为ytrue^i时, 平方误差可以定义为以下公式:

(2.1.10)

将2.1.4式代入2.1.11中可得

(2.1.11)

3.梯度下降算法

梯度下降算法的核心思想是:从一个初始点开始,沿着目标函数的梯度(最陡上升方向)的反方向迭代地更新参数,直到达到最小值。

首先由上面的推导,我们可以得出线性回归的目标函数为:

img

(3.1.1)

我们的目标是找后面平方数的极小值,所以对4.1.1式进行求导可得:

其中m为样本的数量,我们对J求关于θ的偏导得到梯度方程式

img

(3.1.2)

梯度下降算法原理就是每次迭代过程对参数向梯度反方向前进梯度个步数生成新的参数、直到找到最拟合目标函数的参数为止。

批量梯度下降:每次前进总样本的平均梯度,容易得到最优解,但是速度很慢,在数据量大的时候一般不使用,参数迭代方程式如下:

img

(3.1.3)

随机梯度下降:每次找一个样本的梯度进行迭代,速度快,但是随机性强,每次迭代不一定向着收敛的方向,参数迭代方程式如下:

img

(3.1.4)

小批量梯度下降:每次使用一小部分的平均梯度进行迭代,速度快,迭代方向也比较好,经常被使用,参数迭代方程式(12)如下:

img

(3.1.5)

其中α为学习率

4.代码实现

import numpy as np
​
def normalize(features):"""特征归一化:param features: 传入特征:return: 归一化后的特征,特征均值,特征标准差"""features_normalized = np.copy(features).astype(float)# 计算均值features_mean = np.mean(features, 0)# 计算标准差features_deviation = np.std(features, 0)# 标准化操作if features.shape[0] > 1:features_normalized -= features_mean# 防止除以0features_deviation[features_deviation == 0] = 1features_normalized /= features_deviationreturn features_normalized, features_mean, features_deviation
import numpy as np
import normalize
​
​
def generate_polynomials(dataset, polynomials_degree, normalize_data=False):"""变换方法:x1, x2, x1^2, x2^2, x1 * x2, x1 * x2^2, etc.:param dataset:原始数据:param polynomials_degree:多项式的维度:param normalize_data:是否归一化:return:生成的多项式参数"""features_split = np.array_split(dataset, 2, axis=1)dataset_1 = features_split[0]dataset_2 = features_split[1]
​(num_examples_1, num_features_1) = dataset_1.shape(num_examples_2, num_features_2) = dataset_2.shape
​if num_examples_1 != num_examples_2:raise ValueError("can not generate polynomials for two sets with different number")if num_features_1 == 0 and num_features_2 == 0:raise ValueError("can not generate polynomials for two sets with no colums")if num_features_1 == 0:dataset_1 = dataset_2elif num_features_2 == 0:dataset_2 = dataset_1
​num_features = num_features_1 if num_features_1 < num_examples_2 else num_features_2dataset_1 = dataset_1[:, :num_features]dataset_2 = dataset_2[:, :num_features]
​polynomials = np.empty((num_examples_1, 0))for i in range(1, polynomials_degree + 1):for j in range(i + 1):polynomial_feature = (dataset_1 ** (i - j)) * (dataset_2 ** j)polynomials = np.concatenate((polynomials, polynomial_feature), axis=1)
​if normalize_data:polynomials = normalize.normalize(polynomials)[0]
​return polynomials
import numpy as npdef generate_sinusoids(dataset, sinusoid_degree):"""变换方式 sin(x):param dataset: 原始数据:param sinusoid_degree:变换维度:return: 变换后的参数"""num_examples = dataset.shape[0]sinusoids = np.empty((num_examples, 0))for degree in range(1, sinusoid_degree + 1):sinusoid_fatures = np.sin(degree * dataset)sinusoids = np.concatenate((sinusoids, sinusoid_fatures), axis=1)return sinusoids

 

import numpy as np
import normalize
import generate_polynomials
import generate_sinusoids
​
def prepare_for_train(data, polynomial_degree=0, sinusoid_degree=0, normalize_data=True):"""对数据进行预处理:param data: 原始数据:param polynomial_degree: 多项式维度:param sinusoid_degree: 正弦维度:param normalize_data: 是否进行归一化:return: 处理后的数据,特征均值,特征方差"""# 获取样本总数num_examples = data.shape[0]data_processed = np.copy(data)
​# 预处理features_mean = 0features_deviation = 0data_normalized = data_processedif normalize_data:data_normalized, features_mean, features_deviation = normalize.normalize(data_processed)data_processed = data_normalized
​# 特征变量正弦变换if sinusoid_degree > 0:sinusoids = generate_sinusoids.generate_sinusoids(data_normalized, sinusoid_degree)data_processed = np.concatenate((data_processed, sinusoids), axis=1)
​# 特征变量多项式变换if polynomial_degree > 0:polynomials = generate_polynomials.generate_polynomials(data_processed, polynomial_degree, normalize_data)data_processed = np.concatenate((data_processed, polynomials), axis=1)
​# 加一列1data_processed = np.hstack((np.ones((num_examples, 1)), data_processed))
​return data_processed, features_mean, features_deviation

import numpy as np
​
import prepare_train
​
​
class LinearRegression:def __init__(self, data, labels, polynomial_degree=0, sinusoid_degree=0, normalize_data=True):"""1、对数据进行预处理操作2、得到特征个数3、初始化参数矩阵:param data:原始数据:param labels:数据的标签:param polynomial_degree:多项式维度:param sinusoid_degree:正弦维度:param normalize_data:是否进行归一化"""(data_processed, features_mean, features_deviation) = prepare_train.prepare_for_train(data, polynomial_degree,sinusoid_degree,normalize_data)
​self.data = data_processedself.labels = labelsself.features_mean = features_meanself.features_deviation = features_deviationself.polynomial_degree = polynomial_degreeself.sinusoid_degree = sinusoid_degreeself.normalize_data = normalize_data
​num_features = self.data.shape[1]self.theta = np.zeros((num_features, 1))
​def train(self, alpha, num_epoch=500):"""开始训练:param alpha: 学习速率:param num_epoch: 迭代次数:return: 训练好的参数,损失值记录"""cost_history = self.gradient_descent(alpha, num_epoch)return self.theta, cost_history
​def gradient_descent(self, alpha, num_epoch):"""小批量梯度下降算法:param alpha: 学习速率:param num_epoch: 迭代次数:return: 损失值的记录"""cost_history = []for i in range(num_epoch):self.gradient_step(alpha)cost_history.append(self.cost_function(self.data, self.labels))return cost_history
​def gradient_step(self, alpha):"""梯度下降参数更新方法:param alpha: 学习率:return: 无"""num_examples = self.data.shape[0]prediction = LinearRegression.hypothesis(self.data, self.theta)delta = prediction - self.labelstheta = self.thetatheta = theta - alpha * (1 / num_examples) * (np.dot(delta.T, self.data)).Tself.theta = theta
​def cost_function(self, data, labels):"""计算损失值函数(最小二乘法):param data:当前数据:param labels:当前标签:return:预测损失值"""num_example = data.shape[0]delta = LinearRegression.hypothesis(data, self.theta) - labelscost = (1 / 2) * np.dot(delta.T, delta)return cost[0][0]
​@staticmethoddef hypothesis(data, theta):"""求预测值:param data: 输入数据:param theta: 当前参数:return: 预测值"""prediction = np.dot(data, theta)return prediction
​def get_cost(self, data, labels):"""获取损失值:param data: 传入的数据:param labels: 数据的标签:return: 当前模型预测数据的损失值"""(data_processed, _, _) = prepare_train.prepare_for_train(data, self.polynomial_degree, self.sinusoid_degree,self.normalize_data)return self.cost_function(data_processed, labels)
​def predict(self, data):"""预测函数:param data: 输入数据:return: 预测的值"""(data_processed, _, _) = prepare_train.prepare_for_train(data, self.polynomial_degree, self.sinusoid_degree,self.normalize_data)predictions = LinearRegression.hypothesis(data_processed, self.theta)return predictions

今天在b站上刷到了唐宇迪博士数据分析与机器视频课程,并进行对应学习,捋了一天公式,概率论的好多公式都忘了,hhhh

 

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

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

相关文章

YOLOv11入门到入土使用教程(含结构图)

一、简介 YOLOv11是Ultralytics公司在之前的YOLO版本上推出的最新一代实时目标检测器&#xff0c;支持目标检测、追踪、实力分割、图像分类和姿态估计等任务。官方代码&#xff1a;ultralytics/ultralytics&#xff1a;ultralytics YOLO11 &#x1f680; (github.com)https://g…

解决跨域问题

跨域是浏览器受同源策略的限制&#xff0c;同源策略是浏览器为确保资源安全&#xff0c;而遵循的一种策略&#xff0c;该策略对访问资源进行了一些限制&#xff08;如发送 ajax 请求&#xff0c;操作 dom&#xff0c;读取 cookie&#xff09;。 最常见的影响就是发送 ajax 请求…

【微知】如何通过命令行在非串口界面触发sysrq的help信息?(echo h > /proc/sysrq-trigger)

背景 在服务器上&#xff0c;触发sysrq通常需要在串口执行sysrq热键&#xff0c;比如 ~相关的操作 如何通过在ssh界面触发sysrq触发一些操作&#xff1f; 命令 通过sysrq指定的/proc接口文件进行操作 echo h > /proc/sysrq-trigger dmesg #产看输出的帮助信息然后根据打…

Junit + Mockito保姆级集成测试实践

一、做好单测&#xff0c;慢即是快 对于单元测试的看法&#xff0c;业界同仁理解多有不同&#xff0c;尤其是在业务变化快速的互联网行业&#xff0c;通常的问题主要有&#xff0c;必须要做吗&#xff1f;做到多少合适&#xff1f;现在没做不也挺好的吗&#xff1f;甚至一些大…

MYSQL-SQL-01-DDL(Data Definition Language,数据定义语言)

DDL&#xff08;数据定义语言&#xff09; DDL&#xff08;Data Definition Language&#xff09;&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段) 。 一、数据库操作 1、 查询mysql数据库管理系统的所有数据库 语法&#…

django(3)jinja2模版的使用

启动模版 安装jinja2 pip install jinja2 配置setting TEMPLATES中添加配置 {BACKEND: django.template.backends.jinja2.Jinja2,DIRS: [os.path.join(BASE_DIR,jinja2)], #模版在项目中的所在位置} template中各项的含义 这个配置项中模版自上而下加载&#xff0c;重名…

Spring Boot框架的电影评论系统设计与实现

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

基于单片机的智能小区门禁系统设计(论文+源码)

1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心&#xff0c;STM32单片机作为主控单元&#xff0c;通过WiFi模块实现与手机APP的连接&#xff0c;构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…

Linux中Kconfig结构分析

目录结构中&#xff0c;某一层的内容无非就是&#xff0c;要么全是目录&#xff0c;要么全是文件&#xff0c;要么既有目录又有文件&#xff0c;我们的Kconfig文件通常是分布在各级目录中。那么&#xff0c;这些Kconfig如何一层一层地去组织起来呢&#xff1f; 首先明确下&…

VTK的学习方法-第二类型应用

VTK的高级使用方法是自己写一个算法&#xff08;Filter&#xff09;&#xff0c;本文使用的数据类型位polydata&#xff0c;这个数据类型应用比较广泛。 我们的算法一般是继承VTK里面的vtkpolydataalgorithm&#xff0c;然后自己添加一些变量&#xff0c;重写&#xff08;over…

京东 北京 java 中级: 哪些情况下的对象会被垃圾回收机制处理掉? 哪些对象可以被看做是 GC Roots 呢?对象不可达,一定会被垃圾收集器回收么?

我同学最近在面试java的岗位, 这是他遇到的某些关于java的JVM中垃圾回收相关的部分的问题, 他来问我, 我特以此文章来解答. 公司 京东 base 北京 面试时间 2024年10月23日16:00:00 他跟我说, 面试官一上来就问了一个关于JVM的问题, 直接就给他难住了, 问题是 : 哪些情况下…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

通过Python爬虫获取商品销量数据,轻松掌握市场动态

为什么选择Python爬虫&#xff1f; 简洁易用&#xff1a;Python语言具有简洁的语法和丰富的库&#xff0c;使得编写爬虫变得简单高效。强大的库支持&#xff1a;Python拥有强大的爬虫框架&#xff08;如Scrapy、BeautifulSoup、Requests等&#xff09;&#xff0c;可以快速实现…

【记录】Django数据库的基础操作

数据库连接 在Django中使用 mysqlclient 这个包用于数据库的连接&#xff0c;切换至 Django环境中直接 pip install mysqlclient 安装此包 1 数据库连接配置 在项目目录下的setting.py中配置 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mini,#数据库名US…

uniapp修改input中placeholder样式

Uniapp官方提供了两种修改的属性方法&#xff0c;但经过测试&#xff0c;只有 placeholder-class 属性能够生效 <input placeholder"请输入手机验证码" placeholder-class"input-placeholder"/><!-- css --> <style lang"scss" s…

Python的买家秀大揭秘:用代码点亮API数据

在一个充满无限可能的数字世界里&#xff0c;Python侦探正准备开始他的新任务&#xff1a;揭开买家秀API数据的神秘面纱。这不仅是一次技术的挑战&#xff0c;更是一次与时间赛跑的较量。Python侦探&#xff0c;这位编程界的福尔摩斯&#xff0c;打开了他的笔记本电脑&#xff…

C++大坑之——多继承(菱形继承)

文章目录 前言一、多继承是什么&#xff1f;1. 多继承概念2. 多继承语法 二、菱形继承1. 为什么会有菱形继承问题&#xff1f;2. 代码感受菱形继承3. 虚拟继承1&#xff09;虚拟继承概念及语法2&#xff09;虚拟继承的原理 4. 为什么要有虚基表&#xff1f;5. 为什么要有偏移量…

bootloader跳转app卡死(IAP卡死)

1、 关闭所有中断再跳转APP 一般bootloader跳转到APP时要关闭app中用到的中断(防止中断打断程序的运行&#xff0c;导致程序跑飞&#xff09;&#xff0c;那么查看系统中用到的中断&#xff1a;串口中断、滴答定时器中断&#xff0c;所以&#xff0c;跳转之前要关闭这两个中断&…

Vlan和Trunk

VLAN的定义 虚拟局域网&#xff0c;用来在二层网络中隔离广播域不同VLAN的设备在二层网络中无法互相通讯&#xff08;二层隔离技术&#xff09; VLAN的转发过程举例 源MAC字段后加上VLAN TAG字段&#xff0c;其中VLAN ID用来标识VLAN。 PC发送数据帧进入交换机&#xff0c;会…

使用SearXNG-搭建个人搜索引擎(附国内可用Docker镜像源)

介绍 SearXNG是聚合了七十多种搜索服务的开源搜索工具。我们可以匿名浏览页面&#xff0c;不会被记录和追踪。作为开发者&#xff0c;SearXNG也提供了清晰的API接口以及完整的开发文档。 部署 我们可以很方便地使用Docker和Docker compose部署SearXNG。下面给出Docker部署Se…