tensorflow BP神经网络 波士顿房价预测

2023-11-02

前言

啥也别说了,上代码

code

# 根据波士顿房价信息进行预测,多元线性回归 + 特征数据归一化 + 可视化 + TensorBoard可视化
#读取数据
from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差
from sklearn.metrics import r2_score#R square
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd  # 能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具
from sklearn.utils import shuffle  # 随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值

# 迭代轮次
train_epochs = 50

# 学习率
learning_rate = 0.01

# 读取数据文件
def get_data():
    mydf = pd.read_excel('data.xlsx', encoding='utf-8')
    df = mydf.values

    # 把df转换成np的数组格式
    df = np.array(df)
    return df

def normal(df):
    # 特征数据归一化
    # 对特征数据{0到11}列 做(0-1)归一化
    for i in range(13):
        df[:, i] = (df[:, i] - df[:, i].min()) / (df[:, i].max() - df[:, i].min())

    # x_data为归一化后的前12列特征数据
    x_data = df[:, :13]

    # y_data为最后1列标签数据
    y_data = df[:, 13]
    return x_data, y_data

def model():
    # 模型定义
    # 定义特征数据和标签数据的占位符
    # shape中None表示行的数量未知,在实际训练时决定一次带入多少行样本,从一个样本的随机SDG到批量SDG都可以
    x = tf.placeholder(tf.float32, [None, 13], name="X")  # 12个特征数据(12列)
    y = tf.placeholder(tf.float32, [None, 1], name="Y")  # 1个标签数据(1列)

    # 定义模型函数
    # 定义了一个命名空间.
    # 命名空间name_scope,Tensoflow计算图模型中常有数以千计节点,在可视化过程中很难一下子全部展示出来/
    # 因此可用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级
    with tf.name_scope("Model"):
        # w 初始化值为shape=(12,1)的随机数
        w = tf.Variable(tf.random_normal([13, 1], stddev=0.01), name="W")

        # b 初始化值为1.0
        b = tf.Variable(1.0, name="b")
        # w和x是矩阵相乘,用matmul,不能用mutiply或者*
        def model(x, w, b):
            return tf.matmul(x, w) + b
        # 预测计算操作,前向计算节点
        pred = model(x, w, b)

    # 定义均方差损失函数
    # 定义损失函数
    with tf.name_scope("LossFunction"):
        loss_function = tf.reduce_mean(tf.pow(y - pred, 2))  # 均方误差

    # 创建优化器
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
    return loss_function, optimizer, pred, x, y, b, w


def run_model(loss_function, optimizer, pred, x_data, y_data, x, y, b, w):
    # 声明会话
    sess = tf.Session()

    # 定义初始化变量的操作
    init = tf.global_variables_initializer()

    # 为TensorBoard可视化准备数据
    # 设置日志存储目录
    logdir = './test'
    # 创建一个操作,用于记录损失值loss,后面在TensorBoard中SCALARS栏可见
    sum_loss_op = tf.summary.scalar("loss", loss_function)

    # 把所有需要记录摘要日志文件的合并,方便一次性写入
    merged = tf.summary.merge_all()

    # 启动会话
    sess.run(init)

    # 创建摘要的文件写入器
    # 创建摘要writer,将计算图写入摘要文件,后面在Tensorflow中GRAPHS栏可见
    writer = tf.summary.FileWriter(logdir, sess.graph)
    # 迭代训练
    loss_list = []  # 用于保存loss值的列表
    Add_train_y = []
    Add_predict_y = []
    for epoch in range(train_epochs):
        loss_sum = 0.0
        for xs, ys in zip(x_data, y_data):
            xs = xs.reshape(1, 13)
            ys = ys.reshape(1, 1)

            # feed数据必须和Placeholder的shape一致
            _, summary_str, loss = sess.run([optimizer, sum_loss_op, loss_function], feed_dict={x: xs, y: ys})
            writer.add_summary(summary_str, epoch)

            loss_sum = loss_sum + loss

        #   loss_list.append(loss)     #每步添加一次
        # 打乱数据顺序,防止按原次序假性训练输出
        x_data, y_data = shuffle(x_data, y_data)

        b0temp = b.eval(session=sess)  # 训练中当前变量b值
        w0temp = w.eval(session=sess)  # 训练中当前权重w值
        loss_average = loss_sum / len(y_data)  # 当前训练中的平均损失

        loss_list.append(loss_average)  # 每轮添加一次
        print("epoch=", epoch + 1, "loss=", loss_average, "b=", b0temp, "w=", w0temp)

        Add_train_y.append(np.sqrt(mean_squared_error(y_data, sess.run(pred, feed_dict={x: x_data}))))
    return loss_list, pred, Add_train_y, sess


def plot_all(loss_list, x_data, y_data, pred, Add_train_y, sess, x, y):
    plt.plot(loss_list)

    # 模型应用
    n = np.random.randint(506)  # 随机确定一条来看看效果
    print(n)
    x_test = x_data[n]

    x_test = x_test.reshape(1, 13)
    predict = sess.run(pred, feed_dict={x: x_test})
    print("预测值:%f" % predict)

    target = y_data[n]
    print("标签值:%f" % target)
    plt.show()
    #######        曲线拟合效果,可以看出预测效果不错       #####
    test_predictions = sess.run(pred, feed_dict={x: x_data})

    plt.scatter(y_data, test_predictions)
    plt.xlabel('True Values [1000$]')
    plt.ylabel('Predictions [1000$]')
    plt.axis('equal')
    plt.xlim(plt.xlim())
    plt.ylim(plt.ylim())
    _ = plt.plot([-100, 100], [-100, 100])
    plt.show()
    ##########                 #########                                ##

    plt.figure()
    plt.xlabel('Epoch')
    plt.ylabel('Mean Abs Error [1000$]')

    plt.plot(np.arange(50), Add_train_y,
           label = 'MAE')
    plt.legend()
    plt.ylim([0, 10])
    plt.show()

    #######         ##############
    error = test_predictions - y_data
    plt.hist(error, bins = 50)
    plt.xlabel("Prediction Error [1000$]")
    _ = plt.ylabel("Count")
    plt.show()

def main():
    df = get_data()  # getdata
    x_data, y_data = normal(df)
    loss_function, optimizer, pred, x, y, b, w = model()
    loss_list, pred, Add_train_y, sess = run_model(loss_function, optimizer, pred, x_data, y_data, x, y, b, w)
    plot_all(loss_list, x_data, y_data, pred, Add_train_y, sess, x, y)


if __name__ == '__main__':
    main()

结语

写的有点乱,大家凑活看
运行结果如下:
①利用Tensorboard查看神经网络结构图,如图所示可以看出是单层神经元的BP神经网络:
在这里插入图片描述
②观察随着训练轮数的变化,loss值的变化,分别用matplotlib和tensorboard展示

在这里插入图片描述
在这里插入图片描述
③利用matplotlib作图,展示神经网络预测拟合效果,可以看出还是不错的。
在这里插入图片描述
④利用matplotlib作图,查看预测失误情况的直方图,可以看出大部分预测还是准确的:
在这里插入图片描述
⑤利用matplotlib作图,展示平均绝对误差:MAE(Mean Absolute Error)的变化趋势,可以看出在几轮训练之后,趋于减小,最后近乎平稳。
在这里插入图片描述

⑥仿真测试,随机选取数据进行预测,并查看预测效果,可以看出预测效果中等偏上。
索引:375
预测值:15.012003
标签值:19.100000

402
预测值:12.718363
标签值:13.400000

10
预测值:30.206409
标签值:34.700000

239
预测值:31.967896
标签值:26.700000

51
预测值:18.368908
标签值:13.000000

120
预测值:12.289744
标签值:13.400000

参考致谢

https://blog.csdn.net/u012735708/article/details/84337262
https://blog.csdn.net/qq_36712111/article/details/87742822
https://blog.csdn.net/weixin_43737376/article/details/86718103

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tensorflow BP神经网络 波士顿房价预测 的相关文章

随机推荐

  • elasticsearch查看分词结果

    第一种情况 查看任意一段文本 能分成哪些词汇 http localhost 9200 analyze POST 第二种情况 查看已经入库的数据 分词情况 http localhost 9200 index type id termvecto
  • keil中出现Undefined symbol 等问题解决办法

    在keil中仿照别人的程序写了RCC初始化的程序 编译后出现以下问题 obj pro1 axf Error L6218E Undefined symbol FLASH PrefetchBufferCmd referred from main
  • C++动态内存管理——智能指针

    智能指针 1 什么是智能指针 智能指针 smart pointer 是存储指向动态分配 堆 对象指针的类 用于生存期控制 能够确保自动正确的销毁动态分配的对象 防止内存泄露 利用自动调用类的析构函数来释放内存 实现技术是使用引用计数 sha
  • C++——WebServer服务器项目

    项目场景 C WebServer服务器编程 项目搭建 1 配置虚拟机 下载XShell Xftp以及windows版本的VScode 2 安装SSH sudo apt install openssh server 3 在XShell中配置会
  • Parcel打包React

    Parcel打包React Parcel介绍 Parcel 官网 parceljs org 官网上的介绍 极速零配置Web应用打包工具 什么 对的 你没看错 它标称的零配置打包 这个打包工具其实在一些大厂 开发 Electron 和 Rea
  • PAT C入门题目-7-18 出租车计价 (15 分)

    7 18 出租车计价 15 分 本题要求根据某城市普通出租车收费标准编写程序进行车费计算 具体标准如下 起步里程为3公里 起步费10元 超起步里程后10公里内 每公里2元 超过10公里以上的部分加收50 的回空补贴费 即每公里3元 营运过程
  • MAC安装Securecrt

    文章目录 一 下载地址 二 安装软件 1 下载的文件有2个 一个是安装包 一个是安装文件 2 打开安装包以后 将安装程序拖到应用程序中 三 执行安装文件 1 执行安装 2 错误解决 四 安装软件 1 打开SecureCTR后 选择Enter
  • 关于Swagger中访问不了文档页面

    因为在SpringBoot启动类中 没有加上 EnableSwagger2WebMvc注解 这个注解的作用是启用swagger对应用程序暴露的API端点进行文档化 个人推断和拦截器拦截请求有关 解决办法就是加 EnableSwagger2W
  • 计算机精英ACM fellow和ACM杰出科学家,各校校友统计

    首先谢谢东南 大学网友青山人的统计工作 http bbs netbig com thread 2675926 1 1 html 人数相同 按照学校名称拼音排序 先统计最高荣誉 ACM Fellow 1 的精英 中国科大 81硕 李 凯 19
  • Spring面试问答Top 25

    本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题 这些问题有可能在你下次面试时就会被问到 对于本文中未提及的Spring其他模块 我会单独分享面试的问题和答案 欢迎大家向我推荐你在面试过程中遇到关于Spring的问题 我会
  • APP 性能测试工具

    一 APP 自动化测试工具Appium 官网 http appium io GitHub 地址 https github com appium appium 介绍 Appium 是一个开源的 跨平台的自动化测试工具 支持自动化 iOS An
  • 使用adb 命令(atrace)抓起systrace的方法。【转】

    本文转载自 https www cnblogs com liuliu word p 9963017 html adb shell atrace c b 10240 async start z gfx 1 执行查看adb shell atra
  • 【Python案例】一键自动抠图生成证件照

    0 效果与体验 不想去照相馆 担心肖像隐私被第三方获取 不会抠图 本文实现基于人工智能的一键自动抠图生成证件照 在进入正文之前 先看最终效果 为了让读者快速体验 我写了个小程序 证照工具箱 可打开直接体验 1 人脸检测 在制作证件照时 首选
  • Windows下用pandoc将LaTex转成Word——使用错误总结

    以下是废话阶段 一般期刊投稿都是latex版本啊 奈何有时候机缘总是那么巧合 假如需要word版本呢 科研的乐趣 不就是发现问题 解决问题嘛 那么 就开始愉快地解决问题吧 以下是正片 首先 从无到有的过程当然是先借鉴别人的东西啦 所以 我主
  • idea自动生成类和方法注释

    idea自动生成类和方法注释 一 类注释 方式一 打开settings gt File and COde Templates 选中Files gt Class 添加类注释信息 新建一个类 就会看到类上会自动添加注释 方式二 通过设置文件头来
  • 超5星难度【微软Core allocation】Coding赛题 - 解题思路&优秀代码分享,邀你来“找茬儿”

    6月23日英雄会平台发布了一道难度为超5星的微软比赛题目 截止活动结束共有300多名编程爱好者参与线上答题 而最终通过者仅有7人 通过率仅为2 为什么成绩如此出人意料 是因为原题的英文描述难以理解 还是题目本身的难度太高让很多人望而生畏知难
  • Web前端简易复习手册(一)

    Web前端复习题 一 1 创建js对象的几种方式 2 如何访问对象属性和方法 3 解构是什么 4 什么是原型 原型链 5 基于原型的继承两种方式 6 实例成员 7 原型成员 8 类成员 9 Rest参数含义 10 简述arguments对象
  • 动手学数据分析 Task 1

    动手学数据分析 Task 1 一 数据加载 二 Pandas基础 三 探索性数据分析 一 数据加载 项目源数据请见 kaggle 1 对于csv中的数据 pandas库提供两种方法来读取 分别为 read csv 和read table 二
  • null、undefined、NaN的区别。它们之间的隐式转换和全等结果又是什么?

    前言 在 JavaScript 中 null undefined 和 NaN 是三种不同的特殊值 它们在使用时有着不同的含义和用途 而我们在做项目时候 常常与它们打交道 因此 在编写 JavaScript 代码时需要了解它们之间的区别和相互
  • tensorflow BP神经网络 波士顿房价预测

    前言 啥也别说了 上代码 code 根据波士顿房价信息进行预测 多元线性回归 特征数据归一化 可视化 TensorBoard可视化 读取数据 from sklearn metrics import mean squared error 均方