机器学习实战-系列教程2:线性回归1(项目实战、原理解读、源码解读)

🌈🌈🌈机器学习 实战系列 总目录

本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传

机器学习实战-系列教程1:线性回归入门教程
机器学习实战-系列教程2:线性回归1
机器学习实战-系列教程3:线性回归2

1、整体流程简介

  1. 拿到数据data
  2. 数据预处理操作(归一化、标准化)
  3. 怎么样的x和k组合能够更加准确的拟合出真实值
  4. 使用梯度下降算法GD(Gradient Descent)
  5. 通过GD让loss和k之间达到一个收敛关系(这个过程Scikit-learn自动帮我们完成),完成梯度下降算法就可以把线性回归算出来了。
  6. 单个特征和多个特征做对比,在代码中实现出来

2、初始化操作

初始化函数就是将数据处理成机器学习所需要格式与范围,并且把每一个数据都对应好标签,标签也就是真实值,并且将数据分为训练集、验证集、测试集等(具体根据任务设定)

import numpy as np
from utils.features import prepare_for_training
class LinearRegression:def __init__(self,data,labels,polynomial_degree = 0,sinusoid_degree = 0,normalize_data=True):(data_processed, features_mean, features_deviation)  = prepare_for_training(data, polynomial_degree, sinusoid_degree,normalize_data=True)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_datanum_features = self.data.shape[1]self.theta = np.zeros((num_features,1))
  1. 导包
  2. 定义一个线性回归类
  3. 初始化函数定义:初始化操作需要传进来等下需要用到的一些值(数据、标签、多项式特征的最高次数、非线性变换、预处理)
  4. 经过预处理操作
  5. 把定义好的数据拿过来(python特有的)
  6. self.data.shape[1]表示数据有多少列,num_features即特征个数
  7. theta就是k有多少个,一个特征对应一个k

3、训练

3.1 预测函数

@staticmethod
def hypothesis(data,theta):   predictions = np.dot(data,theta)return predictions

预测函数是将原始数据data与权重参数theta进行矩阵的点乘形成的计算结果,第一次计算时,theta是随机产生的(可以自己设置成满足正态分布等)

3.2 参数更新函数

def gradient_step(self,alpha):    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
  1. num_examples:样本个数(data.shape[0]是行数,data.shape[1]列数)
  2. prediction:预测值(得到预测值,用线性回归LinearRegression类调用预测函数hypothesis,将参数和原始数据穿进去)
  3. delta :预测值减去真实值
    δ = d e l t a = ( h θ ( x k ) − y k ) δ=delta =(h_θ(x^k)-y^k) δ=delta=(hθ(xk)yk)
  4. theta :训练得到参数, θ 1 θ_1 θ1对应的是 x 1 x_1 x1,以此类推
    theta 更新公式: θ j = θ j − α 1 10 ∑ k = i i + 9 δ x j k θ_j = θ_j - α\frac{1}{10}\sum_{k=i}^{i+9}δx_j^k θj=θjα101k=ii+9δxjk
  5. self.theta = theta,返回更新的参数

参数更新函数就是调用了预测函数,计算delta ,按照参数更新公式更新参数theta

3.3 损失函数

def cost_function(self,data,labels):"""损失计算方法"""num_examples = data.shape[0]delta = LinearRegression.hypothesis(self.data,self.theta) - labelscost = (1/2)*np.dot(delta.T,delta)/num_examplesreturn cost[0][0]

损失函数就是计算出预测值和真实之间的差异大小的函数。
损失不会是多少样本就计算多少损失,是计算每次平均的损失
num_examples :样本个数
delta :就是预测值减去真实值
cost :就是计算delta 每个差值的平方再除以2,再除以样本个数

3.4 梯度下降函数

def gradient_descent(self,alpha,num_iterations):cost_history = []for _ in range(num_iterations):self.gradient_step(alpha)cost_history.append(self.cost_function(self.data,self.labels))return cost_history

梯度下降函数实际上就是将参数更新函数和损失函数执行多次,因为将所有的数据都会训练一次,每一次的批量都会执行一次参数更新,每次更新的同时也会记录损失。
cost_history 可以将每次的损失记录下来,cost_function可以计算出损失,通过原始数据得到预测值在和真实值之间做差别计算 。

3.5训练函数

def train(self,alpha,num_iterations = 500):cost_history = self.gradient_descent(alpha,num_iterations)return self.theta,cost_history

alpha:学习率
num_iterations :迭代次数
cost_history:保存的所有损失值

训练函数调用梯度下降函数,返回损失,定义迭代次数,一次迭代就是将整个数据集完全训练一次

4、测试

测试集也需要自己的计算损失和进行预测的函数,测试集就不参与训练和参数更新了

4.1 获取当前损失

def get_cost(self,data,labels):  data_processed = prepare_for_training(data,self.polynomial_degree,self.sinusoid_degree,self.normalize_data)[0]return self.cost_function(data_processed,labels)

prepare_for_training是数据预处理函数
cost_function是损失计算的函数

4.2 测试集预测函数

def predict(self,data):"""用训练的参数模型,与预测得到回归值结果"""data_processed = prepare_for_training(data,self.polynomial_degree,self.sinusoid_degree,self.normalize_data)[0]predictions = LinearRegression.hypothesis(data_processed,self.theta)return predictions

先是预处理数据,再把处理后的数据和theta传进预测函数,就可以得到预测结果了,这里专门在测试过程中实现的。

机器学习实战-系列教程1:线性回归入门教程
机器学习实战-系列教程2:线性回归1
机器学习实战-系列教程3:线性回归2

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

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

相关文章

知识大杂烩(uniapp)

首先声明:不敢保证都管用,这是我自己实践得来的。 box-shadow: 这段 CSS 样式代码用于创建一个阴影效果,它是通过 box-shadow 属性来实现的。让我解释一下这段代码的含义: - box-shadow: 这是 CSS 的属性,用于添加阴影…

算法笔记:平衡二叉树

1 介绍 平衡二叉树(AVL树)是一种特殊的二叉搜索树(BST),它自动确保树保持低高度,以便实现各种基本操作(如添加、删除和查找)的高效性能。 ——>时间都维持在了O(logN)它是一棵空…

百度百科词条怎么更新?怎么能顺利更新百科词条?

企业和个人百度百科词条的更新对于他们来说都具有重要的意义,具体如下: 对企业来说: 塑造品牌形象:百度百科是一个常被用户信任并参考的知识平台,通过更新企业词条可以提供准确、全面的企业信息,帮助企业塑…

算法专题:前缀和

文章目录 Acwing:前缀和示例2845.统计趣味子数组的数目思路容易理解的写法:前缀和两层循环存在问题:超时 优化写法:两数之和思路,转换为哈希表 前缀和,就是求数组中某一段的所有元素的和。 求子数组中某一…

Unity3D 连接 SQLite 作为数据库基础功能【详细图文教程】

一、简单介绍一下SQLite的优势(来自ChatGPT) 轻量级: SQLite是一个嵌入式数据库引擎,它的库文件非常小巧,没有独立的服务器进程,适用于嵌入到其他应用程序中,对于轻量级的项目或移动应用程序非常适用。零配…

Golang RabbitMQ实现的延时队列

文章目录 前言一、延时队列与应用场景二、RabbitMQ如何实现延时队列实现延时队列的基本要素整体的实现原理如下 三、Go语言实战生产者消费者 前言 之前做秒杀商城项目的时候使用到了延时队列来解决订单超时问题,本博客就总结一下Golang是如何利用RabbitMQ实现的延时…

结构体对齐原理及在STM32中的设计原则和实现

在嵌入式系统开发中,结构体作为一种常见的数据组织方式,在内存中的布局方式对于程序性能和内存占用具有重要影响。本文将深入探讨单片机C语言中的结构体对齐原理、重要性以及不同的对齐方式,并通过示例演示结构体对齐如何影响内存占用、访问性…

SMT贴片制造:专业、现代、智能的未来之选

在现代科技的快速发展下,SMT贴片制造作为电子元器件的核心工艺之一,正以其专业、现代和智能的特点成为未来的首选。 随着电子产品越来越小型化,传统的手工焊接已经无法满足高速、高精度、高稳定性的要求。而SMT贴片制造作为一种先进的表面贴…

说说复合索引之最左前缀原理?

分析&回答 MySQL中的索引可以以一定顺序引用多个列,这种索引叫做复合(联合)索引。 如果表 Ta 中存在索引 A、B、(C、D) 规则1:全列匹配 SELECT * FROM Ta WHERE E F1 AND A 10001; 复制代码 若没…

【代码随想录】Day 50 动态规划11 (买卖股票Ⅲ、Ⅳ)

买卖股票Ⅲ https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 无语了。。。 写的很好就是怎么都过不了。。。 还是就用代码随想录的写法吧。。。 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector&…

权限提升-Windows本地提权-AT+SC+PS命令-进程迁移-令牌窃取-getsystem+UAC

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的&#xff1f; 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 2、以上常见权限获取方法简要归类说明&#xff1f; 后台权限&#xff1a;SQL注入,数…

DCMM数据能力成熟度评估模型--学习笔记(1)

DCMM数据能力成熟度评估模型--学习笔记 1、DCMM简介、结构组成和成熟度评估等级划分1.1 DCMM简介1.2 DCMM结构组成1.3 DCMM关键过程域1.3.1、数据战略&#xff08;指导方针&#xff09;1.3.2、数据治理 &#xff08;机制保障&#xff09;1.3.3、数据架构 (施工图纸)1.3.4、数据…

【Java】线程都有哪几种状态

文章目录 前言传统线程模型&#xff08;操作系统&#xff09;中线程状态Java线程中的状态线程的运行流程 前言 首先我们要知道&#xff0c;在传统&#xff08;操作系统&#xff09;的线程模型中线程被分为五种状态&#xff0c;在java线程中&#xff0c;线程被分为六种状态。 …

力扣(LeetCode)算法_C++—— 两个数组的交集

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a; 输入&#xff1a;nums1 …

iOS 16.4更新指南:问题解答与新功能一览

我应该更新到iOS 16.4吗&#xff1f;这是许多iPhone用户在新更新可用时问自己的一个常见问题。最新的iOS版本提供了各种功能和改进&#xff0c;因此更新的诱惑力很大。 但是&#xff0c;在更新之前&#xff0c;你应该考虑几个因素&#xff0c;以确保安装过程顺利成功。这些因素…

云计算中的负载均衡技术,确保资源的平衡分配

文章目录 1. 硬件负载均衡器2. 软件负载均衡器3. DNS负载均衡4. 内容分发网络&#xff08;CDN&#xff09; &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;云计算 ✨文章内…

独享IP vs. 共享IP:哪种更适合你?

无论是个人用户还是企业组织&#xff0c;在互联网上都需要一个唯一标识来与其他设备进行通信。这就涉及到使用独立分配给自己或多个用户分享的公共 IP 地址&#xff08;也称为共享 IP&#xff09;。那么&#xff0c;究竟应该选择独占一个专用地址还是与他人分享相同地址呢&…

Android studio 实现生成二维码和扫描二维码

效果图 build.gradle(:app)添加依赖 dependencies {implementation com.google.zxing:core:3.3.3implementation com.journeyapps:zxing-android-embedded:3.6.0implementation com.google.zxing:javase:3.0.0 }Manifests.xml <uses-permission android:name"android…

通过String查改salesforce对象的字段

salesforce对象和字典类似&#xff0c;可以使用put和get方法。 例如如果要获取Account对象acc的Id&#xff0c;可以使用acc.get(‘Id’)。

线程中的join()、wait() 和 notify()详解及练习题

一、join() Thread 类提供了 join() 方法&#xff0c;用于等待当前线程所调用的其他线程执行完毕。 1、当一个线程调用另一个线程的 join() 方法时&#xff0c;它会被阻塞&#xff0c;直到被调用的线程执行完毕或达到指定的超时时间。 比如&#xff1a;当主线程main中调用了…