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
猜你喜欢
- '====================================='功能:根据ip地址输出地区'参数:ip
- 1、实例方法/对象方法实例方法或者叫对象方法,指的是我们在类中定义的普通方法。只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一
- 最近对微格式进行了一些学习,在学习过程中收获不少。在此分享下,欢迎交流!微型格式的优点:1,语义化的HTML和CSS类名称来标记共同内容。2
- 作为一个Oracle数据库开发者或者DBA,在实际工作中经常会遇到这样的问题:试图对库表中的某一列或几列创建唯一索引时,系统提示ORA-01
- 1.字符强转一切如果是字符串进行强制转换, 仅仅就是在原数据类型的两边套上引号2.list : 强制转换成列表""&qu
- 楔子上一篇文章我们探讨了 GIL 的原理,以及如何释放 GIL 实现并行,做法是将函数声明为 nogil,然后使用 with nogil 上
- JavaScript Dom编程 学习书籍选择JavaScript Dom编程学习,很多朋友无疑对如何选择入门的书籍,比较头疼。或许也是他们
- Python2.7Mac OS抓取的是电影天堂里面最新电影的页面。链接地址: http://www.dytt8.net/html/gndy/
- 本文实例讲述了Python设计模式之外观模式。分享给大家供大家参考,具体如下:外观模式(Facade Pattern):为子系统中的一组接口
- sql语句查询数据库中的表名/列名/主键/自动增长值 ----查询数据库中用户创建的表 ----jsj01 为数据库名 select nam
- 一共4个页面:form.asp; chk.asp; num.asp; count.asp得到一个随即数字。加密
- 多线程多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,
- 代码如下:<% set studentinstance = CreateStudent()&n
- 通过本接口可以查询圆通快递、申通快递、ems快递、韵达快递等快递单号查询信息,无需其他额外开发,非常方便首先到www.aikuaidi.cn
- 这是一篇关于使用JScript RuntimeObject(MSDN)调试的文章。虽然这些例子中的大多数在其他浏览器中不能运行,但在IE 5
- 本文实例为大家分享了python语音整点报时的具体代码,供大家参考,具体内容如下主要的技术特殊点在于PyS60的定时器最多只能定2147秒。
- 1. 常用模块# 连接数据库connect()函数创建一个新的数据库连接对话并返回一个新的连接实例对象PG_CONF_123 = {
- 第一步:登陆root用户。第二步:新建一个数据表,并且选好排序规则,此处我使用testtable。第三步:我们新建一个用户输入相关的账户名以
- 说明1、Matplotlib函数可以绘制图形,使用plot函数绘制曲线。2、需要将200个点的x坐标和Y坐标分别以序列的形式输入plot函数
- 本文介绍基于Python中ArcPy模块,对大量栅格遥感影像文件进行批量掩膜与批量重采样的操作。首先,我们来明确一下本文的具体需求。现有一个