机器学习实战-系列教程4:手撕线性回归3之多特征线性回归(项目实战、原理解读、源码解读)

news2024/11/26 15:20:48

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

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

手撕线性回归1之线性回归类的实现
手撕线性回归2之单特征线性回归
手撕线性回归3之多特征线性回归
手撕线性回归4之非线性回归

8、多特征回归模型

前面我们介绍了线性回归一个比较完成的流程以及相应的源码解读,但是仅仅是一个特征对一个特征进行映射,这部分内容开始实现多特征对一个特征进行映射。

8.1 读入数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly
import plotly.graph_objs as go
plotly.offline.init_notebook_mode()
from linear_regression import LinearRegression
data = pd.read_csv('../data/world-happiness-report-2017.csv')
train_data = data.sample(frac=0.8)
test_data = data.drop(train_data.index)
input_param_name_1 = 'Economy..GDP.per.Capita.'
input_param_name_2 = 'Freedom'
output_param_name = 'Happiness.Score'
x_train = train_data[[input_param_name_1, input_param_name_2]].values
y_train = train_data[[output_param_name]].values

x_test = test_data[[input_param_name_1, input_param_name_2]].values
y_test = test_data[[output_param_name]].values
  1. 导包都是一样的
  2. 读数据,分成训练集、测试集
  3. 原始数据这次读入两个特征,标签数据不变
  4. 分别获取训练集的数据与标签,测试集的数据与标签

8.2 数据展示

8.2.1 训练数据轨迹

# Configure the plot with training dataset.
plot_training_trace = go.Scatter3d(
    x=x_train[:, 0].flatten(),
    y=x_train[:, 1].flatten(),
    z=y_train.flatten(),
    name='Training Set',
    mode='markers',
    marker={
        'size': 10,
        'opacity': 1,
        'line': {
            'color': 'rgb(255, 255, 255)',
            'width': 1
        },
    }
)

8.2.2 测试数据轨迹

这里是训练的数据的画图展示,将输入的两个特征与标签对应了三个维度:

  1. 3d图有x、y、z三个轴,我们用两个输入数据x1和x2,以及预测数据y与其对应
  2. 名字、形状(这里是散点)、线条
  3. 线条里面的颜色、宽度
plot_test_trace = go.Scatter3d(
    x=x_test[:, 0].flatten(),
    y=x_test[:, 1].flatten(),
    z=y_test.flatten(),
    name='Test Set',
    mode='markers',
    marker={
        'size': 10,
        'opacity': 1,
        'line': {
            'color': 'rgb(255, 255, 255)',
            'width': 1
        },
    }
)

8.2.3 画图布局

同样的,这是测试数据的展示

plot_layout = go.Layout(
    title='Date Sets',
    scene={
        'xaxis': {'title': input_param_name_1},
        'yaxis': {'title': input_param_name_2},
        'zaxis': {'title': output_param_name} 
    },
    margin={'l': 0, 'r': 0, 'b': 0, 't': 0}
)

画图的布局,x、y、z轴取名,图的取名,以及字体颜色设置

8.2.4 执行画图

plot_data = [plot_training_trace, plot_test_trace]
plot_figure = go.Figure(data=plot_data, layout=plot_layout)
plotly.offline.plot(plot_figure, filename='img.html', auto_open=True)
  1. 传入两个轨迹
  2. 绘图操作
  3. 保存为html文件,弹出浏览器(这里一定会在项目中生成一个html文件,但是是不是自动弹出取决于你的pycharm和系统设置,可以在本地文件中打开这个html文件)

在这里插入图片描述

9、训练

9.1 执行训练

num_iterations = 500  
learning_rate = 0.01  
polynomial_degree = 0  
sinusoid_degree = 0  
linear_regression = LinearRegression(x_train, y_train, polynomial_degree, sinusoid_degree)
(theta, cost_history) = linear_regression.train( learning_rate, num_iterations)
print('开始损失',cost_history[0])
print('结束损失',cost_history[-1])
  1. 迭代次数
  2. 学习率
  3. 非线性变换中用到的
  4. 非线性变换中用到的
  5. 调用线性回归类,生成对象
  6. 执行训练函数,执行过程中会和前面一样调用多个函数
  7. 打印开始损失
  8. 打印结束损失

打印结果:

开始损失 14.570028710012329
结束损失 0.18006554243827635

9.2 打印损失下降过程

plt.plot(range(num_iterations), cost_history)
plt.xlabel('Iterations')
plt.ylabel('Cost')
plt.title('Gradient Descent Progress')
plt.show()
  1. 迭代次数和每次对应的损失作为x、y轴画图
  2. 画图参数

打印结果:
在这里插入图片描述

10、测试与回归线:散点图

10.1 预测

predictions_num = 10
x_min = x_train[:, 0].min()
x_max = x_train[:, 0].max()
y_min = x_train[:, 1].min()
y_max = x_train[:, 1].max()
x_axis = np.linspace(x_min, x_max, predictions_num)
y_axis = np.linspace(y_min, y_max, predictions_num)
x_predictions = np.zeros((predictions_num * predictions_num, 1))
y_predictions = np.zeros((predictions_num * predictions_num, 1))
x_y_index = 0
for x_index, x_value in enumerate(x_axis):
    for y_index, y_value in enumerate(y_axis):
        x_predictions[x_y_index] = x_value
        y_predictions[x_y_index] = y_value
        x_y_index += 1

z_predictions = linear_regression.predict(np.hstack((x_predictions, y_predictions)))
  1. 选出10条的数据, x 1 x_1 x1 x 2 x_2 x2、y,分别对应x轴、y轴、z轴
  2. x 1 x_1 x1最小值
  3. x 1 x_1 x1最大值
  4. x 2 x_2 x2最小值
  5. x 2 x_2 x2最大值
  6. x 1 x_1 x1最小值和最大值作为取值范围,均匀取出10个值,对应x轴
  7. x 2 x_2 x2最小值和最大值作为取值范围,均匀取出10个值,对应y轴
  8. 创建一个有10个数的一组数组,值全为0,作为3d画图中x轴的数据x_predictions
  9. 创建一个有10个数的一组数组,值全为0,作为3d画图中y轴的数据y_predictions
  10. 把前面 x_axis和y_axis的数据赋值给x_predictions和y_predictions
  11. 通过线性回归类的对象调用测试集预测函数生成预测结果

10.2 预测结果3d三点图

plot_predictions_trace = go.Scatter3d(
    x=x_predictions.flatten(),
    y=y_predictions.flatten(),
    z=z_predictions.flatten(),
    name='Prediction Plane',
    mode='markers',
    marker={ 'size': 1,},
    opacity=0.8,
    surfaceaxis=2, 
)

plot_data = [plot_training_trace, plot_test_trace, plot_predictions_trace]
plot_figure = go.Figure(data=plot_data, layout=plot_layout)
plotly.offline.plot(plot_figure)

这里的画图的过程和前面都是一样的,就不再解释了哦
打印结果:
在这里插入图片描述

手撕线性回归1之线性回归类的实现
手撕线性回归2之单特征线性回归
手撕线性回归3之多特征线性回归
手撕线性回归4之非线性回归

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

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

相关文章

Vue中数据可视化关系图展示与关系图分析

Vue中数据可视化关系图展示与关系图分析 数据可视化是现代Web应用程序的重要组成部分之一,它可以帮助我们以图形的方式呈现和分析复杂的数据关系。Vue.js是一个流行的JavaScript框架,它提供了强大的工具来构建数据可视化应用。本文将介绍如何使用Vue.js…

基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题(附完整源码下载)

背包问题算法设计 问题要求在一个物品集合中选择合适的物品放入背包,在放入背包中的物品总重量不超过背包容量的前提下,希望放入背包的物品总价值最大。根据是否允许部分物品放入背包的要求,背包问题可以分为【分数背包问题】和【0-1背包问题…

Spring Web Flow远程代码执行漏洞复现(CVE-2017-4971)

一、搭建环境 cd vulhub/spring/CVE-2017-4971 docker-compose up -d 影响版本:Spring Web Flow 2.4.0 ~ 2.4.4 触发条件: 1.MvcViewFactoryCreator对象的useSpringBeanBinding参数需要设置为false(默认值) 2. flow view对象中设置BinderConfiguration…

网页版QQ签到加速源码 QQ音乐等级加速源码 CF活动一键领取源码 QQ手游等级加速

QQ网页签到加速小工具PHP源码二次优化版 包含QQ空间功能 QQ空白昵称 QQ大会员签到 CF活动一键领取 清空QQ空间说说 QQ每日打卡加速 QQ空间删除说说 QQ手游等级加速 QQ微视等级加速 QQ音乐等级加速签到

【操作系统】24王道考研笔记——第四章 文件管理

第四章 文件管理 一、文件系统基础 1.基本概念 2.文件的逻辑结构 顺序文件: 索引文件: 索引顺序文件: 效率分析: 多级索引顺序文件: 总结: 3.文件目录 文件控制块(FCB) 目录的基本…

第三方软件测评报告怎么做?

第三方软件测试 总体来说,软件产品验收测试一般主要包括以下几个步骤: 1.制定测试计划,测试项,测试策略及验收通过准则,并经过客户参与的计划评审。 2.建立测试环境,设计测试用例,并经过评审…

华脉智联发布国标28181 Android SDK和DEMO

在目前很多行业项目中,客户使用的是海康、大华等监控平台的GB/28181平台,或者是其他的第三方的GB/28181平台。但是对于那些不具备GB/28181协议的单兵终端,如何接入GB/28181平台网络中呢? 首先,我们了解下GB/T28181&…

Vue中表单手机号验证与手机号归属地查询

下面是一篇关于Vue中如何进行表单手机号验证与手机号归属地查询的Markdown格式的文章,包含代码示例。 Vue中表单手机号验证与手机号归属地查询 手机号验证和归属地查询是许多Web应用程序中常见的功能之一。在Vue.js中,我们可以轻松地实现这两个功能。本…

好奇一下各个大模型对华为mate60系列的看法

目前华为Mate60系列手机已上市并获抢购,个人觉得很不错,很好奇各个AI大模型对此事的看法,于是对chatGPT、文心一言、讯飞星火进行了一下粗浅的测试。 题目一(看看三个模型的综合分析能力) “目前华为Mate60系列手机已…

CHS零壹视频恢复程序OCR使用方法

目前CHS零壹视频恢复程序监控版、专业版、高级版已经支持了OCR,OCR是一种光学识别系统,通俗说就和扫描仪带的OCR软件一样的原理: 分析照片->OCR获取字符串->整理字符串->输出 使用方法如下(以CHS零壹视频恢复程序监控版…

最近

深圳近日经历了一场暴雨,周四夜晚,很多下晚班的同事因为雨水没法顺利打车回家。有个朋友,因为打车的等待时间太长,索性直接在公司过夜了。 早上因为磅礴的大雨我搁浅在家,也是因为下雨,本来要和龙哥一起去广…

html禁止用户复制内容方法

要禁止复制内容,可以使用以下几种方法: 使用CSS属性:可以通过设置user-select属性为none,这样用户就无法选中和复制内容。例如: body {-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user…

用栈实现队列,用队列实现栈(JAVA)

用两个栈实现队列 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class CQueue {Stack<Integer>innew Stack<>();Stack<Integer>outnew Stack<>();public CQueue() {Stack<Integer>innew Stack<>();Stack<…

SpringBoot集成Apache RocketMQ详解

文章目录 0. 前言1. Spring Boot 集成Apache RocketMQ详细步骤1.1.添加依赖1.2.配置RocketMQ1.3.创建消息生产者&#xff08;Producer&#xff09;1.4.创建消息消费者&#xff08;Consumer&#xff09; 2. 测试验证3. 常见报错4. 参考文档5. 源码地址 0. 前言 上个章节我们学习…

下载Ubantu镜像文件、创建虚拟机以及ubantu安装详细教程

目录 前言 Ubantu是什么&#xff1f;它有什么作用&#xff1f; 一、Ubantu镜像文件下载步骤 1.第一步安装VMware Workstation 2.第二步下载Ubuntu的镜像文件 镜像文件下载官网网址入下&#xff1a; 二、创建虚拟机和安装Ubantu的步骤 1.打开VMware Workstation并点击创…

反射与注解

【今日】 人生只有一次 不妨大胆一点 目录 一 反射 1.访问构造方法 1.Constructor的使用 2.反射一个类中的所有构造方法 3.用Constructor创建并返回实列对象 2.访问成员变量 1Field的使用方法 2.反射一个类中的所有成员变量 3.获取修改成员变量的值 3.访问成员方…

javaee springMVC model的使用

项目结构图 pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…

【LeetCode75】第五十一题 最大子序列的分数

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们两个长度一样的数组&#xff0c;让我们再num1中找出一个长度为k的子序列&#xff0c;然后把这个子序列累加的和乘上在nums2中对…

74 QML ProgressBar显示进度数字

1 引言 由于目前使用的是qt.5.14版本&#xff0c;Qt Quick Controls 已经从1.0版本 变为2.0版本了&#xff0c;如果继续使用的Qt Quick Controls 1 的style:方式&#xff0c;改变进度条的样式已经不行了&#xff0c;其会报错&#xff1a;Invalid property name "style&quo…

Langchain的一些问题和替代选择

Langchain因其简化大型语言模型(llm)的交互方面的到关注。凭借其高级的API可以简化将llm集成到各种应用程序中的过程。 但是Langchain乍一看似乎是一个方便的工具&#xff0c;但是它有时候否更像是一个语言迷宫&#xff0c;而不是一个直截了当的解决方案。在本文中&#xff0c…