机器学习与深度学习——自定义函数进行线性回归模型

news2024/11/17 2:41:49

机器学习与深度学习——自定义函数进行线性回归模型

目的与要求

1、通过自定义函数进行线性回归模型对boston数据集前两个维度的数据进行模型训练并画出SSE和Epoch曲线图,画出真实值和预测值的散点图,最后进行二维和三维度可视化展示数据区域。
2、通过自定义函数进行线性回归模型对boston数据集前四个维度的数据进行模型训练并画出SSE和Epoch曲线图,画出真实值和预测值的散点图,最后进行可视化展示数据区域。

步骤

1、先载入boston数据集 Load Iris data
2、分离训练集和设置测试集split train and test sets
3、对数据进行标准化处理Normalize the data
4、自定义损失函数
5、使用梯度下降算法训练线性回归模型
6、初始化模型参数
7、训练模型
8、对训练集和新数据进行预测
9、画出SSE和Epoch折线图
10、画出真实值和预测值的散点图
11、进行可视化

代码

1、通过自定义函数进行线性回归模型对boston数据集前两个维度的数据进行模型训练并画出SSE和Epoch曲线图,画出真实值和预测值的散点图,最后进行二维和三维度可视化展示数据区域。

#引入所需库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 读取数据
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
x = data[:,:2] # 只使用前两个特征进行线性回归
y = target.reshape(-1,1)

#自定义函数进行线性回归
def compute_cost(X, y, theta):
    """
    计算损失函数(平均误差平方和)
    """
    m = len(y)
    predictions = X.dot(theta)
    cost = (1/(2*m)) * np.sum(np.square(predictions-y))
    return cost

def gradient_descent(X, y, theta, learning_rate, num_epochs):
    """
    使用梯度下降算法训练线性回归模型
    """
    m = len(y)
    cost_history = np.zeros(num_epochs)
    theta_history = np.zeros((num_epochs, theta.shape[0]))
    
    for epoch in range(num_epochs):
        predictions = X.dot(theta)
        errors = predictions - y
        theta = theta - (1/m) * learning_rate * (X.T.dot(errors))
        
        cost = compute_cost(X, y, theta)
        cost_history[epoch] = cost
        theta_history[epoch,:] = theta.T
    
    return theta, cost_history, theta_history

#对输入特征进行标准化
mean_x = np.mean(x, axis=0)          #求出每一列特征的平均值
std_x = np.std(x, axis=0)            #求出每一列特征的标准差。
x = (x - mean_x) / std_x           #将每一列特征进行标准化,即先将原始数据减去该列的平均值,再除以该列的标准差,这样就能得到均值为0,标准差为1的特征 
X = np.hstack([np.ones((len(x),1)), x]) # 添加一列全为1的特征,表示截距项

# 初始化模型参数
theta = np.zeros((X.shape[1],1))

# 训练模型
learning_rate = 0.01
num_epochs = 1000
theta, cost_history, theta_history = gradient_descent(X, y, theta, learning_rate, num_epochs)

# 对训练集进行预测
predictions = X.dot(theta)
predictions[:10]

# 对新数据进行预处理
new_data = np.array([[0.01, 18]]) # 假设新数据是 CRIM=0.01,ZN=18
new_data = (new_data - mean_x) / std_x
new_X = np.hstack([np.ones((1,1)), new_data]) # 添加截距项

# 使用训练出的模型参数进行预测
new_predictions = new_X.dot(theta)
new_predictions
print('预测的房价为:${:.7f}'.format(float(new_predictions)*1000))

# 画出Epoch曲线图
#将每个特征在训练过程中更新的参数θ的变化情况绘制出来,可以看到不同特征在训练过程中的变化趋势
plt.figure()
plt.plot(range(num_epochs), theta_history[:, 0], label='theta0')
plt.plot(range(num_epochs), theta_history[:, 1], label='theta1')
plt.show()

# 画出SSE和Epoch折线图
plt.figure(figsize=(10,5))
plt.plot(range(num_epochs), cost_history)
plt.xlabel('Epoch')
plt.ylabel('SSE')
plt.title('SSE vs. Epoch')
plt.show()

# 画出预测值与真实值的比较图
plt.figure(figsize=(10,5))
plt.scatter(y, predictions)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title('True Values vs. Predictions')
plt.show()

# 画出数据二维可视化图
plt.figure(figsize=(10,5))
plt.scatter(x[:,0], y)
plt.xlabel('CRIM')
plt.ylabel('MEDV')
plt.title('CRIM vs. MEDV')
plt.show()

# 画出数据三维可视化图
fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x[:,0], x[:,1], y)
ax.set_xlabel('CRIM')
ax.set_ylabel('ZN')
ax.set_zlabel('MEDV')
ax.set_title('CRIM-ZN vs. MEDV')
plt.show()

1、通过自定义函数进行线性回归模型对boston数据集前四个维度的数据进行模型训练并画出SSE和Epoch曲线图,画出真实值和预测值的散点图,最后进行可视化展示数据区域。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#载入数据
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
x = data[:,:2]#前2个维度
y = target
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 读取数据
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
x = data[:,:4] # 
y = target.reshape(-1,1)

#自定义函数进行线性回归
def compute_cost(X, y, theta):
    """
    计算损失函数(平均误差平方和)
    """
    m = len(y)
    predictions = X.dot(theta)
    cost = (1/(2*m)) * np.sum(np.square(predictions-y))
    return cost

def gradient_descent(X, y, theta, learning_rate, num_epochs):
    """
    使用梯度下降算法训练线性回归模型
    """
    m = len(y)
    cost_history = np.zeros(num_epochs)
    theta_history = np.zeros((num_epochs, theta.shape[0]))
    
    for epoch in range(num_epochs):
        predictions = X.dot(theta)
        errors = predictions - y
        theta = theta - (1/m) * learning_rate * (X.T.dot(errors))
        
        cost = compute_cost(X, y, theta)
        cost_history[epoch] = cost
        theta_history[epoch,:] = theta.T
    
    return theta, cost_history, theta_history

#对输入特征进行标准化
mean_x = np.mean(x, axis=0)          #求出每一列特征的平均值
std_x = np.std(x, axis=0)            #求出每一列特征的标准差。
x = (x - mean_x) / std_x           #将每一列特征进行标准化,即先将原始数据减去该列的平均值,再除以该列的标准差,这样就能得到均值为0,标准差为1的特征 
X = np.hstack([np.ones((len(x),1)), x]) # 添加一列全为1的特征,表示截距项

# 初始化模型参数
theta = np.zeros((X.shape[1],1))

# 训练模型
learning_rate = 0.01
num_epochs = 1000
theta, cost_history, theta_history = gradient_descent(X, y, theta, learning_rate, num_epochs)
# 画出Epoch曲线图
#将每个特征在训练过程中更新的参数θ的变化情况绘制出来,可以看到不同特征在训练过程中的变化趋势
plt.figure()
plt.plot(range(num_epochs), theta_history[:, 0], label='theta0')
plt.plot(range(num_epochs), theta_history[:, 1], label='theta1')
plt.plot(range(num_epochs), theta_history[:, 2], label='theta2')
plt.plot(range(num_epochs), theta_history[:, 3], label='theta3')
plt.show()


# 对训练集进行预测
predictions = X.dot(theta)
predictions[:10]

# 对新数据进行预处理
new_data = np.array([[ 0.01,18,2.310,0]]) # 假设新数据是 CRIM=0.01,ZN=18,INDUS=2.310,CHAS=0
new_data = (new_data - mean_x) / std_x
new_X = np.hstack([np.ones((1,1)), new_data]) # 添加截距项

# 使用训练出的模型参数进行预测
new_predictions = new_X.dot(theta)
new_predictions
print('预测的房价为:${:.7f}'.format(float(new_predictions)*1000))
# 画出SSE曲线图
plt.figure()
plt.plot(range(num_epochs), cost_history)
plt.xlabel('Epoch')
plt.ylabel('SSE')
plt.title('SSE vs. Epoch')
plt.show()
# 画出预测值与真实值的比较图
plt.figure(figsize=(10,5))
plt.scatter(y, predictions)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title('True Values vs. Predictions')
plt.show()

# 可视化前四个维度的数据
#前四个维度数据的可视化图像。其中横轴为第一个特征CRIM,纵轴为第二个特征ZN,纵轴为第三个特征INDUS,点的颜色为第四个特征的值。
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x[:, 0], x[:, 1], x[:, 2], c=x[:, 3], cmap='cool')
ax.set_xlabel('CRIM')
ax.set_ylabel('ZN')
ax.set_zlabel('INDUS')
plt.title('Boston Housing Data')
plt.show()

效果图

1、通过自定义函数进行线性回归模型对boston数据集前两个维度的数据进行模型训练并画出SSE和Epoch曲线图,画出真实值和预测值的散点图,最后进行二维和三维度可视化展示数据区域。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
画出SSE(误差平方和)随Epoch(迭代次数)的变化曲线图,用来评估模型训练的效果。在每个Epoch,模型都会计算一次预测值并计算预测值与实际值之间的误差(即损失),然后通过梯度下降算法更新模型参数,使得下一次预测的误差更小。随着Epoch的增加,SSE的值会逐渐减小,直到收敛到一个最小值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、通过自定义函数进行线性回归模型对boston数据集前四个维度的数据进行模型训练并画出SSE和Epoch曲线图,画出真实值和预测值的散点图,最后进行可视化展示数据区域。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
画出SSE(误差平方和)随Epoch(迭代次数)的变化曲线图,用来评估模型训练的效果。在每个Epoch,模型都会计算一次预测值并计算预测值与实际值之间的误差(即损失),然后通过梯度下降算法更新模型参数,使得下一次预测的误差更小。随着Epoch的增加,SSE的值会逐渐减小,直到收敛到一个最小值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用梯度下降算法训练线性回归模型的基本思路是:先随机初始化模型参数θ,然后通过迭代调整参数θ,使得损失函数的值尽量小。模型训练完成后,我们可以用训练好的模型对新的数据进行预测。

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

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

相关文章

day68_Vue基础

今日内容 零、 复习昨日 零、 复习昨日 一、Vue简介 1.1 简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式的js框架,发布于 2014 年 2 月。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注…

100、基于STM32单片机自动跟随小车 红外遥控控制小车避障模式 跟随模式设计(程序+原理图+PCB源文件+流程图+硬件设计资料+元器件清单等)

绪 论 智能小车通过各种感应器获得外部环境信息和内部运动状态,实现在复杂环境背景下的自主运动,从而完成具有特定功能的机器人系统。而随着智能化电器时代的到来,它们在为人们提供的舒适的生活环境的同时,也提高了制造智能化电器…

系统上线前,SQL脚本的9大坑

前言 系统上线时,非常容易出问题。 即使之前在测试环境,已经执行过SQL脚本了。但是有时候,在系统上线时,在生产环境执行相同的SQL脚本,还是有可能出现一些问题。 有些小公司,SQL脚本是开发自己执行的&am…

React Dva修改路由设置,不要井号

我们Dva项目的路由 他默认是设置了带井号的这种 其实我觉得到还可以 但是有些人会觉得不太美观 如果 你想去除他 那么 你先要在终端执行 npm install --save history将 history 引入进来 装好之后 我们来到src下的 index.js 加上如下代码 import {createBrowserHistory as …

nginx配置例子-反向代理实现

4.1 反向代理实现(实例1) 4.1.1需要实现的效果 (1)打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到liunx.系统tomat主页面中 4.1.2 准备工作 (1)在liunx, 系统安装 tomcat, 使用默认端口8080. tomcat安装文…

【C++】-vector的具体使用(迭代器失效问题)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

【Nacos】Nacos 2.2.4支持pg数据库适配改造

Nacos 2.2.4支持postgresql数据库 本文基源码&#xff1a;扩展插件包 网上资料都有&#xff0c;还是个人爬坑补充异常处理记录&#xff0c;以便后续升级改造有漏洞修复 下载源码 https://github.com/alibaba/nacos/releases 添加依赖 根pom添加pg依赖 <postgresql.vers…

跨平台轻量级RTSP服务模块设计思路及实现探讨

技术背景 为满足内网无纸化/电子教室等内网超低延迟需求&#xff0c;避免让用户配置单独的服务器&#xff0c;我们发布了轻量级RTSP服务模块&#xff0c;轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP或者RTMP服务&#xff0c;实现本地的音视频数据&#xff…

(4)【轨迹优化篇】方法一:基于Frenet车道线坐标系,采用解耦采样五次多项式拟合进行局部规划

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言A、第一章&#xff1a;Frenet车道线坐标系介绍及坐标转换一、frenet坐标系介绍1.Frenet坐标的定义2.ST图&#xff08;纵向速度…

【ARM Coresight 系列文章 3 - ARM Coresight 组件 DAP(Debug Access Port) 介绍】

文章目录 1.1 Debug Access Port1.2 Access Port1.2.1 IDR 寄存器 1.3 Mem-APs 介绍1.3.1 Debug 寄存器访问模型1.3.2 APs 中寄存器的介绍 1.1 Debug Access Port 外部 Debugger(DS-5/Trace32) 会通过JTAG接口或者SWD接口和DAP相连&#xff1a; JITAG 一般是5个pin&#xff1…

JAVA每日一练(1)

【程序1】 题目&#xff1a;古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子对数为多少&#xff1f; import java.util.Scanner;/*…

【ElasticSearch】数据聚合语法与Java实现

文章目录 1、聚合的分类2、DSL实现bucket聚合3、DSL实现Metrics 聚合4、RestClient实现聚合5、需求&#xff1a;返回过滤条件的信息6、带过滤条件的聚合 1、聚合的分类 聚合&#xff08;aggregations&#xff09;可以实现对文档数据的统计、分析、运算。&#xff08;类比MySQL…

如何记牢托福口语考试的关键词?

一般情况下&#xff0c;托福独立口语一类问题是自由回答间题(Free-choice Response)&#xff0c;如&#xff1a;If you could have any job in the world, what would it be? Use details to support your. response;另一类是选择类问题(Paired-choice Response)&#xff0c;如…

BERT论文解读及实现(一)

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 1 论文解读 1.1 模型概览 There are two steps in our framework: pre-training and fine-tuning. bert由预训练模型微调模型组成。 ① pre-training, the model is trained on unlabele…

前端Vue入门-day01

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Vue 快速上手 Vue 概念 创建实例 插值表达式 响应式特性 开发者工具 Vue 指令 v-show v-if …

【Spring Boot】第一个Spring Boot项目:helloworld

第一个Spring Boot项目&#xff1a;helloworld 本节从简单的helloworld程序开始介绍创建Spring Boot项目的方法和流程&#xff0c;以及Spring Boot项目结构&#xff0c;最后介绍项目中非常重要的pom.xml文件。 1.创建Spring Boot项目 有两种方式来构建Spring Boot项目的基础…

【1++的C++初阶】之string

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C初阶】 文章目录 一&#xff0c;浅谈string类二&#xff0c;string 类常用接口2.1 string的构造2.2 string类对象的容量操作2.3 string类对象的访问及遍历操作2.4 string类对象的修改操作2.…

Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘

Python 有趣的模块之pynupt ——通过pynput控制鼠标和键盘 文章目录 Python 有趣的模块之pynupt ——通过pynput控制鼠标和键盘1️⃣简介2️⃣鼠标控制与移动3️⃣键盘控制与输入4️⃣结语&#x1f4e2; 1️⃣简介 &#x1f680;&#x1f680;&#x1f680;学会控制鼠标和键盘是…

Mongodb连接数据库

1.初始化 npm init 2.安装mongoose npm i mongoose 3.导入mongoose const mongooserequire("mongoose") 4.连接mongodb服务 mongoose.connect("mongodb://127.0.0.1:27017/user") 说明&#xff1a;mongodb是协议,user是数据库&#xff0c;如果没有会自动创…

经OPA运放后,读取电压出错

问题&#xff1a; 在焊接完两块板子上传程序测试时&#xff0c;程序上传完成&#xff0c;有一块板子在使用OPA读取电压时&#xff0c;在未插入电阻情况下&#xff0c;电压读取是正确的&#xff0c;在插入50K电压后&#xff0c;电压值应该是之前的两倍&#xff0c;但是电压变化…