Python纯代码通过神经网络实现线性回归的拟合方式
作者:Zhao-Jichao 发布时间:2022-07-12 23:54:59
纯代码通过神经网络实现线性回归的拟合
参考链接中的文章,有错误,我给更正了。
并且原文中是需要数据集文件的,我直接给替换成了一个数组,采用直接赋值的方式。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
class SimpleDataReader(object):
def __init__(self, data_file):
self.train_file_name = data_file
self.num_train = 0
self.XTrain = None
self.YTrain = None
# read data from file
def ReadData(self):
# data = np.load(self.train_file_name)
# self.XTrain = data["data"]
# self.YTrain = data["label"]
self.XTrain = np.array([0.95, 3, 4, 5.07, 6.03, 8.21, 8.85, 12.02, 15], dtype=float)
self.YTrain = np.array([5.1, 8.7, 11.5, 13, 15.3, 18, 21, 26.87, 32.5], dtype=float)
self.num_train = self.XTrain.shape[0]
#end if
# get batch training data
def GetSingleTrainSample(self, iteration):
x = self.XTrain[iteration]
y = self.YTrain[iteration]
return x, y
def GetWholeTrainSamples(self):
return self.XTrain, self.YTrain
class NeuralNet(object):
def __init__(self, eta):
self.eta = eta
self.w = 0
self.b = 0
def __forward(self, x):
z = x * self.w + self.b
return z
def __backward(self, x,y,z):
dz = z - y # 原错误为:dz = x * (z - y)
db = dz
dw = dz
return dw, db
def __update(self, dw, db):
self.w = self.w - self.eta * dw
self.b = self.b - self.eta * db
def train(self, dataReader):
for i in range(dataReader.num_train):
# get x and y value for one sample
x,y = dataReader.GetSingleTrainSample(i)
# get z from x,y
z = self.__forward(x)
# calculate gradient of w and b
dw, db = self.__backward(x, y, z)
# update w,b
self.__update(dw, db)
# end for
def inference(self, x):
return self.__forward(x)
if __name__ == '__main__':
# read data
sdr = SimpleDataReader('ch04.npz')
sdr.ReadData()
# create net
eta = 0.1
net = NeuralNet(eta)
net.train(sdr)
# result
print("w=%f,b=%f" %(net.w, net.b))
# 绘图部分
trainX,trainY = sdr.GetWholeTrainSamples()
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制散点图
ax.scatter(trainX,trainY)
# 绘制线性回归
x = np.arange(0, 15, 0.01)
f = np.vectorize(net.inference, excluded=['x'])
plt.plot(x,f(x),color='red')
# 显示图表
plt.show()
Ref:
通过神经网络实现线性回归的拟合
Python使用线性回归和神经网络模型进行预测
公路运量主要包括公路客运量和公路货运量两个方面。
根据研究,某地区的公路运量主要与该地区的人数、机动车数量和公路面积有关,表5-11给出了某个地区20年的公路运量相关数据。
根据相关部门数据,该地区2010年和2011年的人数分别为73.39万和75.55万,机动车数量分别为3.9635万辆和4.0975万辆,公路面积分别为0.9880万平方千米和1.0268万平方千米。
请利用BP神经网络预测该地区2010年和2011年的公路客运量和公路货运量。
表5-11 运力数据表
年份 人数 机动车数量 公路面积 公里客运量 公里货运量
1990 20.55 0.6 0.09 5126 1237
1991 22.44 0.75 0.11 6217 1379
1992 25.37 0.85 0.11 7730 1385
1993 27.13 0.9 0.14 9145 1399
1994 29.45 1.05 0.2 10460 1663
1995 30.1 1.35 0.23 11387 1714
1996 30.96 1.45 0.23 12353 1834
1997 34.06 1.6 0.32 15750 4322
1998 36.42 1.7 0.32 18304 8132
1999 38.09 1.85 0.34 19836 8936
2000 39.13 2.15 0.36 21024 11099
2001 39.99 2.2 0.36 19490 11203
2002 41.93 2.25 0.38 20433 10524
2003 44.59 2.35 0.49 22598 11115
2004 47.3 2.5 0.56 25107 13320
2005 52.89 2.6 0.59 33442 16762
2006 55.73 2.7 0.59 36836 18673
2007 56.76 2.85 0.67 40548 20724
2008 59.17 2.95 0.69 42927 20803
2009 60.63 3.1 0.79 43462 21804
注:数据取自《Matlab在数学建模中的应用(第2版)》,卓金武,第134页。
#1.数据获取
import pandas as pd
data = pd.read_excel('运力数据表.xlsx')
x = data.iloc[:20,:4]
y = data.iloc[:20,4:]
#2.导入线性回归模块,简称为LR
from sklearn.linear_model import LinearRegression as LR
lr = LR() #创建线性回归模型类
lr.fit(x,y) #拟合
slr=lr.score(x,y) #判定系数 R^2
c_x=lr.coef_ #x对应的回归系数
c_b=lr.intercept_ #回归系数常数项
#3.预测
x1 = data.iloc[20:,:4]
r1=lr.predict(x1) #采用自带函数预测
#print('x回归系数为:',c_x)
#print('回归系数常数项为:',c_b)
#print('判定系数为:',slr)
#print('样本预测值为:',r1)
n=list(data["公里客运量(万人)"])
n.extend(r1[:,0])
num=pd.DataFrame(n).dropna()
g=list(data["公里货运量(万吨)"])
g.extend(r1[:,1])
gravity=pd.DataFrame(g).dropna()
import pandas as pd
import matplotlib.pyplot as plt #导入绘图库中的pyplot模块,并且简称为plt
#构造绘图所需的横轴数据列和纵轴数据列
#在figure界面上绘制线性图
plt.rcParams['font.sans-serif'] = 'SimHei' #设置字体为SimHei
plt.figure(1)
plt.plot(data["年份"],num,'r*--') #红色“*”号连续图,
plt.xlabel('日期')
plt.ylabel('公里客运量(万人')
plt.title('公里客运量(万人)走势图')
plt.xticks(data["年份"],rotation = 45)
plt.savefig('myfigure1')
plt.figure(2)
plt.plot(data["年份"],gravity,'b*--') #红色“*”号连续图,
plt.xlabel('日期')
plt.ylabel('公里货运量(万吨)')
plt.title('公里货运量(万吨)走势图')
plt.xticks(data["年份"],rotation = 45)
plt.savefig('myfigure2')
from sklearn.neural_network import MLPRegressor
clf = MLPRegressor(solver='lbfgs', alpha=1e-5,hidden_layer_sizes=8, random_state=1)
clf.fit(x, y);
rv=clf.score(x,y)
r2=clf.predict(x1)
print('样本预测值为:',r2)
n2=list(data["公里客运量(万人)"])
n2.extend(r2[:,0])
num2=pd.DataFrame(n2).dropna()
g2=list(data["公里货运量(万吨)"])
g2.extend(r2[:,1])
gravity2=pd.DataFrame(g2).dropna()
结果显示:
来源:https://zhaojichao.blog.csdn.net/article/details/121205731


猜你喜欢
- 今天来给大家讲讲python中最基本的 if 条件语句,这几乎是所有编程语言中都存在的语句,只是语法结构稍有不同。程序之
- 在使用爬虫爬取别的网站的数据的时候,如果爬取频次过快,或者因为一些别的原因,被对方网站识别出爬虫后,自己的IP地址就面临着被封杀的风险。一旦
- 基于tkinter模块的GUIGUI是图形用户界面的缩写,图形化的用户界面对使用过计算机的人来说应该都不陌生,在此也无需进行赘述。Pytho
- # -*- coding: utf-8 -*- import numpy as npimport matplotlib.pyplot as
- 实际操作中我们经常需要寻找数据的某行或者某列,这里介绍我在使用Pandas时用到的两种方法:iloc和loc。loc:通过行、列的名称或标签
- matplotlib绘图库模块安装pip install matplotlib导入pyplot子模块import matplotlib.py
- 编写思路:把本地文件在客户端通过base64编码以后发送目的地.测试过程中,上传文件过大,导致超时不成功.后来经过改善.把编码分段发送.测试
- 1.为模块nester创建文件夹nester,其中包含:nester.py(模块文件):"""这是"
- 问题原因:长时间未使用 mysql,或因异常操作(强制关机),导致 mysql 服务自动关闭,并且在任务管理器的服务里面找不到 mysql
- 前言logging模块是Python内置的标准模块,主要用于输出脚本运行日志,可以设置输出日志的等级、日志保存路径等。可以通过设置不同的日志
- 1. Mysql binlog参数配置log-bin=mysql-bin打开二进制日志功能,默认在datadir下binlog-ignore
- zip通常用于将两个列表合并在一起以同时进行迭代遍历注意:直接使用zip输出结果为<zip at 0x1d72cf30bc8>,
- 索引相关1. 查询(或更新,删除,可以转换为查询)没有用到索引这是最基础的步骤,需要对sql执行explain查看执行计划中是否用到了索引,
- tomorrow是我最近在用的一个爬虫利器,该模块属于第三方的一个模块,使用起来非常的方便,只需要用其中的threads方法作为装饰器去修饰
- 简述由于某些原因,在使用 import 时,Python 找不到相应的模块。这时,解释器就会发牢骚 - ImportError。那么,Pyt
- 本文实例讲述了Python编程实现正则删除命令功能。分享给大家供大家参考,具体如下:脚本用途:在DOS下使用del功能箭头,不支持正则表达式
- 本文介绍的MySQL数据库的出错代码表,依据MySQL数据库头文件mysql/include/mysqld_error.h整理而成。详细内容
- 本文实例讲述了python自动zip压缩目录的方法。分享给大家供大家参考。具体实现方法如下:这段代码来压缩数据库备份文件,没有使用pytho
- 一、多线程同步由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的
- 在没步入正轨之前,先给大家介绍JavaScript 特殊字符你可以在 JavaScript 中使用反斜杠来向文本字符串添加特殊字符。插入特殊