波士顿房价预测(终版讲解)

代码段分四个部分:库的引入、加载数据(函数)、配置网络结构(类)、运行部分(获取数据,创建网络,启动训练,作图)

我的是基础版,库只用到了numpy和matplotlib的pyplto两个。

加载数据需要进行将数据作为数组输入,重整成14*N的二维数组,分训练集和测试集并归一化

重点在配置网络结构部分。搭建神经网络:搭建神经网络就像是用积木搭宝塔。在飞桨中,网络层(layer)是积木,而神精网络是要搭建的宝塔 这里通过创建python类的方式完成模型网络的定义,即定义__init__函数和forward函数等。

最后通过调用函数完成模型的训练并作出loss的图

第一部分:库的引入


#加载相关库
import numpy as np
import matplotlib.pyplot as plt

这一部分没什么好说的。paddle版的库引入库可能会比较复杂,这里基础班只用到这两个库。

第二部分:加载数据

#数据预处理
def load_data():datafile = './data/data108228/housing.data'data = np.fromfile(datafile,sep=' ')   #分隔符:如果一个文件是文本文件,默认空格分隔feature_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE','DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']feature_num = len(feature_names)data = data.reshape(data.shape[0]//feature_num,feature_num)ratio = 0.8offset=int(data.shape[0]*ratio)training_data = data[:offset]maximums, minimums, avge = training_data.max(axis=0), training_data.min(axis=0), training_data.sum(axis=0) / training_data.shape[0]#记录数据的归一化参数,在预测时对数据归一化global max_valuesglobal min_valuesglobal avg_valuesmax_values = maximumsmin_values = minimumsavg_values = avge#有的案例加了有的没加,不明白为什么要加,先加上了for i in range(feature_num):data[:, i] = (data[:, i]-avge[i]) / (maximums[i]-minimums[i])training_data = data[:offset]test_data = data[offset:]return training_data, test_data

load_data函数返回训练集和测试集两个数组

首先加载文件,这里的分隔符是空格,所以写sep='  '

然后将十三个预测参数和lable的名字给feature_names,用feature_num记录参数的个数,下面要用到feature_num这个变量。

之后重整数据,读入的是一维的数据,需要将它转换为二维的14*N的二维数据

接下来是分组和归一化。由于所有数据都要用训练集的范围来进行归一化操作,先找到训练集,计算出它的最值和均值(其中的axis=0是对第零维,也就是行进行操作)去对所有数据进行归一化,归一化完成后分成两组输出。

第三步:配置网络结构

#数据预处理
def load_data():datafile = './data/data108228/housing.data'data = np.fromfile(datafile,sep=' ')   #分隔符:如果一个文件是文本文件,默认空格分隔feature_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE','DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']feature_num = len(feature_names)data = data.reshape(data.shape[0]//feature_num,feature_num)ratio = 0.8offset=int(data.shape[0]*ratio)training_data = data[:offset]maximums, minimums, avge = training_data.max(axis=0), training_data.min(axis=0), training_data.sum(axis=0) / training_data.shape[0]#记录数据的归一化参数,在预测时对数据归一化global max_valuesglobal min_valuesglobal avg_valuesmax_values = maximumsmin_values = minimumsavg_values = avge#有的案例加了有的没加,不明白为什么要加,先加上了for i in range(feature_num):data[:, i] = (data[:, i]-avge[i]) / (maximums[i]-minimums[i])training_data = data[:offset]test_data = data[offset:]return training_data, test_data
In [8]
#配置网络结构
class Network(object):def __init__(self, num_of_weights):np.random.seed(0)        # 随机产生w的初始值,为了保持程序每次运行结果的一致性,此处设置固定的随机数种子self.w = np.random.randn(num_of_weights, 1)self.b = 0.def forward(self, x):z = np.dot(x, self.w) + self.breturn zdef loss(self, z, y):error = z - ycost = error * errorcost = np.mean(cost)return costdef gradient(self, x, y):z = self.forward(x)gradient_w = (z-y)*xgradient_w = np.mean(gradient_w, axis=0)gradient_w = gradient_w[:, np.newaxis]gradient_b = (z-y)gradient_b = np.mean(gradient_b)return gradient_w, gradient_bdef update(self, gradient_w, gradient_b, eta=0.01):self.w = self.w - eta * gradient_wself.b = self.b - eta * gradient_bdef train(self, training_data, num_epochs, batch_size=10, eta=0.01):n = len(training_data)losses=[]for epoch_id in range(num_epochs):np.random.shuffle(training_data)mini_batches = [training_data[k:k+batch_size] for k in range(0, n, batch_size)]for iter_id, mini_batch in enumerate(mini_batches):x = mini_batch[:, :-1]y = mini_batch[:, -1:]a = self.forward(x)loss = self.loss(a, y)gradient_w, gradient_b = self.gradient(x, y)self.update(gradient_w, gradient_b, eta)losses.append(loss)print('Epoch {:3d} / iter {:3d}, loss = {:4f}'.format(epoch_id, iter_id, loss))return losses

这一步是核心拆开来解析:

class Network(object):def __init__(self, num_of_weights):np.random.seed(0)        # 随机产生w的初始值,为了保持程序每次运行结果的一致性,此处设置固定的随机数种子self.w = np.random.randn(num_of_weights, 1)self.b = 0.

创建一个类:Network,这种数据类型中包含两部分,w数组和b,因为自变量有13个,所以它们的系数需要一个数组来存,b就初始化为0就可以

                                                             y=\sum_{i=0}^{12} w_{i}x_{i}+b

def forward(self, x):z = np.dot(x, self.w) + self.breturn z

forward函数 forward函数是框架指定实现向前计算逻辑的函数,返回预测结果。用当前w和x点乘,返回预测结果y(bar)

def loss(self, z, y):error = z - ycost = error * errorcost = np.mean(cost)return cost

计算损失函数,返回损失值,是个平均数,注意是一个数。

def gradient(self, x, y):z = self.forward(x)gradient_w = (z-y)*xgradient_w = np.mean(gradient_w, axis=0)gradient_w = gradient_w[:, np.newaxis]gradient_b = (z-y)gradient_b = np.mean(gradient_b)return gradient_w, gradient_b

计算梯度函数,先算出用当前w预测的结果,然后用结果算出梯度并求均值。公式就是求偏导。gradient_w需要按行平均,平均后是[w0,w1,,,,,,w12],shape=(13,),但w是(13,1)所以需要给gradient_w添加新的一维(虚的)。

返回两个梯度,w的是数组,b的是一个数

def update(self, gradient_w, gradient_b, eta=0.01):self.w = self.w - eta * gradient_wself.b = self.b - eta * gradient_b

更新函数。完成更新操作,原系数 - 学习率和梯度的乘积

def train(self, training_data, num_epochs, batch_size=10, eta=0.01):n = len(training_data)losses=[]for epoch_id in range(num_epochs):np.random.shuffle(training_data)mini_batches = [training_data[k:k+batch_size] for k in range(0, n, batch_size)]for iter_id, mini_batch in enumerate(mini_batches):  #在字典上是枚举的意思x = mini_batch[:, :-1]y = mini_batch[:, -1:]a = self.forward(x)loss = self.loss(a, y)gradient_w, gradient_b = self.gradient(x, y)self.update(gradient_w, gradient_b, eta)losses.append(loss)print('Epoch {:3d} / iter {:3d}, loss = {:4f}'.format(epoch_id, iter_id, loss))return losses

两层循环:

        第一层进行num_epochs(迭代周期)次。每次先打乱数据,将数据分组(,每组长度为batch_size,之后嵌套下一层循环

        第二层遍历mini_batchs。先将它分成参数和label,计算预测值,损失函数和梯度。更新w

输出当前的轮次,索引和损失函数。并记录每一个loss到losses里,方便作图。

enumerate用处:遍历索引和元素。

list1 = ["this", "is", "a", "test"]
for index, item in enumerate(list1):print index, item
>>>
0 this
1 is
2 a
3 test

第四步:启动训练


training_data, test_data = load_data()net = Network(13)losses = net.train(training_data, num_epochs=50, batch_size=100, eta=0.1)plot_x = np.arange(len(losses))  #返回有起点和终点的固定步长的排列
plot_y = np.array(losses)
plt.plot(plot_x, plot_y)
plt.show()

很简单,直接看结果:

Epoch   0 / iter   0, loss = 2.467436
Epoch   0 / iter   1, loss = 1.541610
Epoch   0 / iter   2, loss = 1.569710
Epoch   0 / iter   3, loss = 1.853896
Epoch   0 / iter   4, loss = 0.503186
Epoch   1 / iter   0, loss = 1.919441...
Epoch  49 / iter   0, loss = 0.093340
Epoch  49 / iter   1, loss = 0.066011
Epoch  49 / iter   2, loss = 0.083206
Epoch  49 / iter   3, loss = 0.096158
Epoch  49 / iter   4, loss = 0.071400

 这样房价预测模型就训练完了

保存模型用到  np.save('w.npy', net.w)

                        np.save('b.npy', net.b)

模型的测试在下一个版本记录

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

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

相关文章

基于大数据的房价数据可视化分析预测系统

温馨提示:文末有 CSDN 平台官方提供的博主 Wechat / QQ 名片 :) 1. 项目背景 房地产是促进我国经济持续增长的基础性、主导性产业,二手房市场是我国房地产市场不可或缺的组成部分。由于二手房的特殊性,目前市场上实时监测二手房市场房价涨幅的…

Kaggle房价预测详解

Kaggle房价预测详解 1.导入数据2.查看各项主要特征与房屋售价的关系查看中央空调与售价关系查看装修水平与房价关系查看建造日期与售价关系不同地段与房价关系查看地皮面积与房价关系查看地下室总面积与房价关系查看关联性 3.训练集数据预处理训练数据预处理创建机器学习模型得…

数据集:波士顿地区房价预测

数据集:波士顿地区房价预测 数据集下载地址 本文以线性回归模型预测为主 1. 数据集说明 变量名变量描述CRIM城镇人均犯罪率ZN住宅地超过25000平方英尺的比例INDUS城镇非零售商用土地的比例CHAS查理斯河空变量(如果边界是河流,则为1&#x…

AI for Science的上半场:人工智能如何重新定义科学研究新范式?

AI发展七十余年,每一技术性突破都将给人类未来开辟新一种可能性。而它与科学研究的深度融合,则会裂变出无数或无穷种可能性。 来源 :36氪 万众瞩目下,今年10月,有着诺贝尔奖“嫡传”之称的诺贝尔化学奖终于揭晓,授予了…

【分享NVIDIA GTC 23大会干货】加速生成式AI在生物学和医疗领域的应用

【分享NVIDIA GTC 23大会干货】加速生成式AI在生物学和医疗领域的应用 1. NVIDIA医疗领域AI计算平台——NVIDIA CLARA2. NVIDIA CLARA医学影像子平台——MONAI3. NVIDIA CLARA医疗设备子平台——Holoscan4. NVIDIA基因组学解决方案Parabricks5. NVIDIA药物研发解决方案6. 个人思…

GTC 2023 万字纪要 | Don‘t Miss This Defining Moment in AI

「Don’t Miss This Defining Moment in AI」 「切勿错过 AI 的决定性时刻」 北京时间 2023 年 3 月 21 日 23:00,「皮衣刀客」黄教主在 GTC 2023 发表主题如上的 Keynote 演讲,并称「这将是我们迄今为止最重要的一次 GTC」,NVIDIA官方 Twi…

「国际科技信息中心SCITIC论坛」细胞,基因和人工智能:探索医学研究的未来...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 随着科技的不断进步,我们现在拥有了许多前所未有的工具和技术,可以更深入地研究和了解人体内部的细胞和基因。人工智能技术的发展,也为医学研究带来了全新的机遇。例如&#…

明天10:00「国际科技信息中心SCITIC论坛」细胞,基因和人工智能:探索医学研究的未来...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 随着科技的不断进步,我们现在拥有了许多前所未有的工具和技术,可以更深入地研究和了解人体内部的细胞和基因。人工智能技术的发展,也为医学研究带来了全新的机遇。例如&#…

Nat. Biotechnol. | 生成式AI在生物科学领域发展迅速

在过去的一年中,人工智能迎来了突破性的技术,它们来自OpenAI的DALL-E2和ChatGPT。 Link: https://openai.com/dall-e-2 Link: https://openai.com/blog/chatgpt 或许你在网络上已经或多或少了解了一些,甚至已经在无意中使用过了这些技术所带来…

OpenAI新模型惊艳了!对话问答能力逆天

编|昕朋 Aeneas源|新智元 OpenAI新模型来了!全新对话模型ChatGPT,可以回答用户问题,还能挑出问题的错误之处。面对不懂的问题,还会承认错误并拒绝回答! 当人们翘首期待GPT-4时,OpenA…

买股不如买基?Python实现快速追踪基金的收益情况!谁还不是个买基高手?

​ 大家知道,近几年,不少同学都是经由基金进入到股市中的。去年就很流行“买股不如买基”的说话,至于股票和基金到底谁更好,这个仁者见仁智者见智,恐怕一时半会儿也说不清楚。 今天,阳哥给大家分享的主题是…

研报精选230505

目录 【行业230505国信证券】风电or电网产业链周评(4月第5周):海风开发资源集中释放,黑色类原材料价格持续下行 【行业230505天风证券】通信AI系列之:人工智能之火点燃算力需求,AI服务器迎投资机遇 【行业2…

你最关心的4个零代码问题,ChatGPT 帮你解答了!

作为人工智能(AI)新型聊天机器人模型 ChatGPT,刚上线5天就突破100万用户,两个多月全球用户量破亿,不愧为业界最炙热的当红炸子鸡。 ChatGPT 是一种语言生成模型,由 OpenAI 开发和训练。它是基于 Transform…

问ChatGPT:零基础如何学好.Net Core?

更多开源项目请查看:一个专注推荐.Net开源项目的榜单 ChatGPT横空出世,一下子让全球互联网企业都慌了,纷纷表示:马上跟进发布ChatGPT,媒体纷纷报道大有改变教培行业。 下面我们问问ChatGPT:零基础如何学好…

GPT-4刚发布就有手机APP接入,上传照片视频一键解读,还当起了美版知乎的问答bot...

萧箫 发自 凹非寺量子位 | 公众号 QbitAI GPT-4刚发布,就已经有手机应用接入了! 只需要上传图像,再用语音提出需求,GPT-4就能帮助视障人士“看清”眼前的世界。 随时随地,实时解读,就像聊天对话一样自然。 …

whisper:robust speech recognition via large-sacle weak supervision

OpenAI Whisper 精读【论文精读45】_哔哩哔哩_bilibili更多论文:https://github.com/mli/paper-reading, 视频播放量 68331、弹幕量 327、点赞数 2332、投硬币枚数 1192、收藏人数 983、转发人数 394, 视频作者 跟李沐学AI, 作者简介 ,相关视频&#xff…

《通义听悟能这么用?大佬语音面试音频通义AI总结》

此文章更适用与:有会议记录、直播记录、面试记录的朋友和知识内容博主等 1、把录音视频文件上传到电脑 2、上传音视频入口 3、上传音视频 4、选择语言是否翻译 5、选择是否区分发言人 我这里是某大佬的语音面试音频文件,选择了2人对话。 6、效果展示 总…

强到离谱!2023年必备的21款AI工具

2022年是AI技术大发展的一年,特别是ChatGPT的很空出世,让AI工具迎来大爆发,今天就给大家整理出21款免费且实用的AI工具推荐,无论是做设计还是日常学习工作都能用得到。2023年已经开始,让这些AI工具帮你提升生产效率&am…

《AI上字幕》基于openAI研发的whisper模型,语音(视频)一键转文本/字幕/带时间轴/支持多语言/自带翻译《桌面版教程》

简介: OpenAI的chatGPT非常火爆,其实OpenAI旗下的另一个模型实力也十分强大,它就是开源免费的Whisper语音转文本模型,目前为止它是较为顶尖的语音转文本模型 当前github上也有许多出色的开发者根据此模型开发出桌面版语音转文字应…

用GitChat赚钱的6种方法

先说下GitChat这个平台,其主页是:https://gitbook.cn/ 。 GitChat是针对技术人的知识付费平台,创始人是谢工,中途被CSDN收购,现在属于CSDN,不过依然是以独立品牌在运作。目前已完成和CSDN的衔接&#xff0c…