与经典线性回归比较

import matplotlib.pyplot as plt

%matplotlib inline

import tensorflow as tf

import numpy as np

from sklearn.linear_model import LinearRegression

#from sklearn.datasets.samples_generator import make_regression

Xdata = np.array([4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0])

Ydata = np.array([33, 42, 45, 51, 53, 61, 62])

plt.figure(figsize=(8,5))

plt.scatter(Xdata,Ydata, s = 80)

plt.xlabel('x', fontsize= 16)

plt.tick_params(labelsize=16)

这些点看来在一条直线上,因此线性回归可能有用。

构建阶段

这些点看来在一条直线上,因此线性回归可能有用。

构建阶段

我们来构建神经网络。它只有一个神经元,使用线性激活函数。

#定义模型函数

def model(x,w,b):

    return tf.multiply(x,w)+b

def loss_fun(x,y,w,b):

    err = model(x,w,b)-y

    squared_err = tf.square(err)

    return tf.reduce_mean(squared_err)

def grad(x,y,w,b):

    with tf.GradientTape() as tape:

        loss_ = loss_fun(x,y,w,b)

    return tape.gradient(loss_,[w,b])

需要一些额外的节点:

  • 损失函数 J
  • 使损失函数最小的节点

改变数据集的形状

我们然望 X 和 Y 是一行的张量。我们可以检查一下

print(Xdata.shape)

print(Ydata.shape)

这不是我们想要的,所以我们要改变它们

x = Xdata.reshape(1,-1)

y = Ydata.reshape(1,-1)

print(x.shape)

print(y.shape)

现在更好了... 为了检查不同的学习速率我们可以定义函数进行训练

def run_linear_model(learning_rate, train_epochs, x,y, debug = False):   

    #开始训练,轮数为epoch,采用SGD随机梯度下降优化方法

  w = tf.Variable(np.random.randn(),tf.float32)

  b = tf.Variable(0.0,tf.float32)

  #count = tf.Variable(0.0,tf.float32)

    #开始训练,轮数为epoch,采用SGD随机梯度下降优化方法

  loss = []

  count = 0

  display_count = 10 #控制显示粒度的参数,每训练10个样本输出一次损失值

  for epoch in range(train_epochs):

    for xs,ys in zip(x,y):  #for xs,ys in zip(x_data,y_data):

        #计算损失,并保存本次损失计算结果

        loss_ =loss_fun(xs,ys,w,b)

        loss.append(loss_)

        #计算当前[w,b]的梯度

        delta_w,delta_b = grad(xs,ys,w,b)

        change_w = delta_w * learning_rate

        change_b = delta_b * learning_rate

        w.assign_sub(change_w)

        b.assign_sub(change_b)

        #训练步数加1

        count = count +1

        if count % display_count == 0:

            print('train epoch : ','%02d'%(epoch+1),'step:%03d' % (count),'loss= ','{:.9f}'.format(loss_))

       #完成一轮训练后,画图

    #plt.plot(x,w.numpy() * x +b.numpy())   #plt.plot(x_data,w.numpy() * x_data +b.numpy())

  return loss

ch = run_linear_model(0.1, 1000, x, y, True)

很有趣... 我们试一下更小的学习速率

ch1 = run_linear_model(1e-3, 1000, x, y, True)

ch2 = run_linear_model(1e-3, 5000, x, y, True)

检查 J... 一直在变小。

绘制损失函数

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.plot(ch1, ls='solid', color = 'black')

ax.plot(ch2, ls='solid', color = 'red')

ax.set_xlabel('epochs', fontsize = 16)

ax.set_ylabel('Cost function $J$ (MSE)', fontsize = 16)

plt.xlim(0,1000)

plt.tick_params(labelsize=16)

你看不到有什么区别,我们来放大一下

你看不到有什么区别,我们来放大一下

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.plot(ch2, ls='solid', color = 'red')

ax.plot(ch1, ls='solid', color = 'black')

ax.set_ylim(3,3.6)

ax.set_xlabel('epochs', fontsize = 16)

ax.set_ylabel('Cost function $J$ (MSE)', fontsize = 16)

plt.xlim(0,5000)

plt.tick_params(labelsize=16)

注意到学习速率越小,收敛速度越慢... 我们试一下快一点的...

ch3 = run_linear_model(1e-2, 5000, x, y, True)

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.plot(ch3, ls='solid', lw = 3, color = 'blue', label = r"$\gamma = 10^{-2}$ up to 5000 epochs")

ax.plot(ch2, ls='solid', lw = 3, color = 'red', label = r"$\gamma = 10^{-3}$ up to 5000 epochs")

ax.plot(ch1, ls='--', lw = 5, color = 'black',label = r"$\gamma = 10^{-3}$, up to 1000 epochs")

ax.set_ylim(2.6,3.6)

ax.set_xlabel('epochs', fontsize = 16)

ax.set_ylabel('Cost function $J$ (MSE)', fontsize = 16)

plt.xlim(0,5000)

plt.legend(fontsize = 16)

plt.tick_params(labelsize=16)

现在接近扁平...

尝度找到最佳参数

ch5 = run_linear_model(0.03, 5000, x, y, True)

#构建线性函数的斜率和截距

w = tf.Variable(np.random.randn(),tf.float32)

b = tf.Variable(0.0,tf.float32)

#设置迭代次数和学习率

train_epochs = 5000

learning_rate = 0.03

loss = []

count = 0

display_count = 10 #控制显示粒度的参数,每训练10个样本输出一次损失值

#开始训练,轮数为epoch,采用SGD随机梯度下降优化方法

for epoch in range(train_epochs):

    for xs,ys in zip(x,y):  #for xs,ys in zip(x_data,y_data):

        #计算损失,并保存本次损失计算结果

        loss_ =loss_fun(xs,ys,w,b)

        loss.append(loss_)

        #计算当前[w,b]的梯度

        delta_w,delta_b = grad(xs,ys,w,b)

        change_w = delta_w * learning_rate

        change_b = delta_b * learning_rate

        w.assign_sub(change_w)

        b.assign_sub(change_b)

        #训练步数加1

        count = count +1

        if count % display_count == 0:

            print('train epoch : ','%02d'%(epoch+1),'step:%03d' % (count),'loss= ','{:.9f}'.format(loss_))

       #完成一轮训练后,画图

#plt.plot(x,w.numpy() * x +b.numpy())   #plt.plot(x_data,w.numpy() * x_data +b.numpy())

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.plot(ch5, ls='solid', lw = 3, color = 'green', label = r"$\gamma = 0.03$ up to 5000 epochs")

ax.plot(ch3, ls='solid', lw = 3, color = 'blue', label = r"$\gamma = 10^{-2}$ up to 5000 epochs")

ax.plot(ch2, ls='solid', lw = 3, color = 'red', label = r"$\gamma = 10^{-3}$ up to 5000 epochs")

ax.plot(ch1, ls='--', lw = 5, color = 'black',label = r"$\gamma = 10^{-3}$, up to 1000 epochs")

ax.set_ylim(2.6,3.6)

ax.set_xlabel('epochs', fontsize = 16)

ax.set_ylabel('Cost function $J$ (MSE)', fontsize = 16)

plt.xlim(0,5000)

plt.legend(fontsize = 16)

plt.tick_params(labelsize=16)

看来绿色或蓝色线的值是可以达到的... 所以它们是好的候选...

pred_y = model(x,w.numpy(),b.numpy()) 

mse_y = tf.reduce_mean(tf.square(pred_y - y))

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

   

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.scatter(y, pred_y, lw = 5)

ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw = 5)

ax.set_xlabel('Measured Target Value', fontsize = 16)

ax.set_ylabel('Predicted Target Value', fontsize = 16)

plt.tick_params(labelsize=16)

如何找到权重?

通常我们感兴趣于线性回归的参数。使用神经网络时我们只对预测感兴趣,因为参数太多,但看一下如何是从计算图获得参数是很有启发性的。我们的线性方程 为

y=wx1+b

且 w 包含于 tf.Variable W, 且偏置bias在 tf.Variable b里。所以要得到它们我们只要简单的要求tensorflow评估节点。

参数为

#显示训练结果

print('w: ',w.numpy())

print('b: ',b.numpy())

所以我们可以用最佳拟合绘制数据

x_ = np.arange(4, 7, 0.05).reshape(1,-1)

yfit_ = model(x_ ,w.numpy(),b.numpy())

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

   

fig = plt.figure(figsize=(8, 5))

ax = fig.add_subplot(1, 1, 1)

ax.plot(x_[0], yfit_[0], label = "Linear Regression")

ax.scatter (x,y, color = 'red', s = 80, label = "True Data")

ax.set_xlabel('x', fontsize = 16)

ax.set_ylabel('y', fontsize = 16)

plt.legend(fontsize = 16)

plt.tick_params(labelsize=16)

与经典的线性回归进行比较

我们比较一下经典线性回归的结果 sklearn

xt = x.reshape(7,-1)

yt = y.reshape(7,-1)

reg = LinearRegression().fit(xt,yt)

reg.score(xt,yt)

reg.coef_

reg.intercept_

xt_ = x_[0].reshape(60,-1)

yfitsk_ = reg.predict(xt_.reshape(60,-1))

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

   

fig = plt.figure(figsize=(8, 5))

ax = fig.add_subplot(1, 1, 1)

ax.plot(x_[0], yfit_[0], label = "Linear Regression")

ax.plot(x_[0], yfitsk_, label = "sklearn Linear Regression")

ax.scatter (x,y, color = 'red', s = 80, label = "True Data")

ax.set_xlabel('x', fontsize = 16)

ax.set_ylabel('y', fontsize = 16)

plt.legend(fontsize = 16)

plt.tick_params(labelsize=16)

ch4 = run_linear_model(1e-2, 15000, x, y, True)

#构建线性函数的斜率和截距

w = tf.Variable(np.random.randn(),tf.float32)

b = tf.Variable(0.0,tf.float32)

#设置迭代次数和学习率

train_epochs = 15000

learning_rate = 1e-2

loss = []

count = 0

display_count = 10 #控制显示粒度的参数,每训练10个样本输出一次损失值

#开始训练,轮数为epoch,采用SGD随机梯度下降优化方法

for epoch in range(train_epochs):

    for xs,ys in zip(x,y):  #for xs,ys in zip(x_data,y_data):

        #计算损失,并保存本次损失计算结果

        loss_ =loss_fun(xs,ys,w,b)

        loss.append(loss_)

        #计算当前[w,b]的梯度

        delta_w,delta_b = grad(xs,ys,w,b)

        change_w = delta_w * learning_rate

        change_b = delta_b * learning_rate

        w.assign_sub(change_w)

        b.assign_sub(change_b)

        #训练步数加1

        count = count +1

        if count % display_count == 0:

            print('train epoch : ','%02d'%(epoch+1),'step:%03d' % (count),'loss= ','{:.9f}'.format(loss_))

       #完成一轮训练后,画图

#print(W_, b_)

print('w: ',w.numpy())

print('b: ',b.numpy())

经典线性回归的结果为

9.5, -2.67857143

所以非常的接近!

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

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

相关文章

服务器中故障转移机制是指什么意思?

在企业服务器和数据中心当中,电源冗余机制和故障转移机制是保障系统高可用性和稳定性的重要组成部分,电源故障转移系统可以帮助企业有效减少服务器因为硬件故障导致业务中断的情况,本文就来详细了解一下服务器中故障转移机制。服务器中的故障…

rook-ceph的osd没有启动rook-ceph-osd-prepare状态异常处理

rook-ceph搭建好ceph之后,查看ceph集群状态,发现三节点只有两个osd状态正常注:这里是已经恢复后的截图。 使用kubectl get pod -n rook-ceph查看pod都是处于运行状态 rook-ceph-osd-prepare也都是Completed没问题,实际使用kubectl…

ubuntu手动编译VTK9.3 Generating qmltypes file 失败

​在Ubuntu上手动编译VTK 9.3时,可能会遇到 Generating qmltypes file失败的问题。这个问题通常与VTK在处理Qt依赖时发生的错误有关。以下是解决该问题的详细步骤和相关解释。一、确保系统依赖正确安装在编译VTK之前,需要确保所有依赖项已经正确安装&…

计算机科学导论(1)哈佛架构

文章目录一、哈佛架构的定义与起源二、哈佛架构的核心组成与工作原理1. **物理结构:独立的存储与总线**2. **工作流程:并行处理的实现**三、哈佛架构与冯诺依曼架构的对比四、哈佛架构的优缺点分析1. **优势**2. **局限性**五、哈佛架构的实际应用场景1.…

VBScript 安装使用教程

一、VBScript 简介 VBScript(Visual Basic Scripting Edition)是微软推出的一种轻量级脚本语言,语法类似于 Visual Basic,广泛应用于系统管理、自动化脚本、网页客户端(IE 专属)以及 Windows 批处理等场景…

RSTP 拓扑收敛机制

RSTP拓扑收敛触发条件 RSTP中检测到拓扑变化只有一个标准:以一个非边缘端口迁移到Forwarding状态 收敛过程 为本交换设备的所有非边缘指定端口和根端口启动TC While Timer,该计时器是Hello Time(默认2s)的两倍,然后…

支持向量机(SVM)分类

支持向量机(Support Vector Machine,SVM)是一种经典的监督学习算法,主要用于分类任务,也可扩展到回归问题(称为支持向量回归,SVR)。其核心思想是通过寻找一个最优超平面,…

Linux操作系统从入门到精通!第二天(命令行)

一、Linux的命令行 1.Linux介绍:刚出世的时候,没有什么节目,所有的操作都是靠命令行来执行,后来Linux发展迅速,也出现了图形界面,但是由于命令行的执行速度比图形界面块,所以也得到了…

使用Go高效对接印度金融市场数据:K线、新股与实时行情开发指南

使用Go高效对接印度金融市场数据:K线、新股与实时行情开发指南 印度国家交易所(NSE)日均交易额超79亿美元,孟买交易所(BSE)覆盖上市公司超5000家,双交易所体系为投资者提供了丰富机会。本文基于…

【计算机网络】补充

仅供参考 如果本地域名服务器无缓存,当采用递归方法解析另一网络某主机域名时,用户主机和本地域名服务器发送的域名请求条数分别为() A.1条 1条 B.1条 多条 C.多条 1条 D.多条 多条 A CSMA/CD的中文含义是(&#x…

最新PDF转markdown软件MonkeyOCR整合包,文档图片解析工具

MonkeyOCR是上个月刚发布的一款文档解析工具,可以将PDF文档或图片识别转换为markdown格式文件。官方测试显示性能极佳。我基于当前最新版制作了免安装一键启动整合包,支持批量操作,并降低了显卡要求。 MonkeyOCR官方介绍 MonkeyOCR 采用结构…

创客匠人深度剖析:家庭教育赛道创始人 IP 打造与知识变现的破局之道

在知识付费领域,家庭教育赛道的竞争日益激烈,如何从 0-1 打造创始人 IP 并实现高效拓客,成为创业者的核心难题。创客匠人服务的慈航德教育创始人陈向杰老师,通过视频号运营、产品矩阵设计与社群生态构建,实现单月拓客 …

UDP服务器主要是指什么意思?

UDP的全称为用户数据报协议,是一种在计算机网络中常用的传输协议,属于是传输层协议,UDP属于是一种无连接的协议,在发送数据信息之前,发送方和接收方不需要建立任何握手连接,主要是用于发送小量数据的实时应…

arm 精准总线错误与非精准总线错误

一、总线错误 1.1 arm总线设计 要了解什么是总线错误,就要先了解arm的总线设计。 AMBA(Advanced Micro-Controller Bus Architecture)是由ARM Limited公司推出的On-Chip Bus片上总线规范,是目前芯片总线的主流标准(该标准在不断演进&#…

Unity UGUI的Canvas以及内部元素之间遮挡关系调整

调UI遮挡关系有三种思路: 调Sorting Layer,层级越后渲染到越前面调Order in Layer,数字越大渲染到越前面修改UI材质调RenderQueue,数字越大越后渲染 对前两种比较陌生的同学可以看一下我以前写的这篇,不看也没事&…

SpringCloud系列(46)--SpringCloud Bus实现动态刷新全局广播

前言:上一节中我们简单的介绍了什么是SpringCloud Bus,SpringCloud Bus的用处,而本节内容则是使用SpringCloud Bus来实现动态刷新全局广播。 实现动态刷新全局广播的设计思想的架构图 注:在实现SpringCloud Bus动态刷新全局广播前…

Java+Vue开发的电子招投标管理系统,实现全流程线上操作,高效规范,助力招投标活动透明公正开展

前言: 在数字化浪潮席卷全球的当下,传统招投标模式面临着效率低下、信息不透明、管理成本高等诸多挑战。电子招投标管理系统应运而生,它借助先进的互联网技术和信息化手段,实现了招投标全流程的电子化、自动化和智能化管理。该系…

MyBatisPlus-02-核心功能

文章目录【README】【1】MyBatis-plus常见注解【2】MyBatis-Plus常见配置【2.1】MyBatis-Plus配置示例【3】MyBatisPlus核心内容【3.1】条件构造器【3.1.1】业务场景1-带多字段条件的查询-使用QueryWrapper【3.1.2】业务场景2-带条件的更新-使用QueryWrapper【3.1.3】业务场景3…

ZYNQ MPSOC GTH aurora8b10b IP的修改与仿真

1 ip设置好后的顶层模块接口: 根据自己的开发板修改接口如下: odule gtwizard_ultrascale_0_example_top (// Differential reference clock inputsinput wire mgtrefclk0_x0y1_p,input wire mgtrefclk0_x0y1_n,// Serial data ports for transceiver channel 0input w…

机器学习之线性回归

主要参考: 机器学习| 算法笔记-线性回归(Linear Regression) - 知乎 (zhihu.com) 2-2 线性回归_哔哩哔哩_bilibili Python机器学习实战:线性回归模型预测波士顿房价_哔哩哔哩_bilibili 回归分析 在数学和统计学中,回归…