1、实验目的
掌握TensorFlow低阶API,能够运用TensorFlow处理数据以及对数据进行运算。
2、实验内容
①实现张量维度变换,部分采样等; ②实现张量加减乘除、幂指对数运算; ③利用TensorFlow对数据集进行处理。
3、实验过程
题目一
加载波士顿房价数据集,并按照以下要求选择属性、计算并绘图。(20分) ⑴ 以二维数组的形式显示属性NOX、RM和LSTAT,其中每一行为一个样本,每一列为一个属性或房价。(4分) ⑵ 选择属性RM和房价,绘制散点图。其中每个样本的属性值为**x****i**,每个样本的房价为**y****i**, **i**为样本的索引值。(2分) ⑶ 使用TensorFlow分别计算**w**和**b**,并输出结果。(10分)
⑶ 以w为斜率,b为截距,做出一条直线,和第⑵问的散点图绘制在同一张图上。(3分)
⑷ 观察这条直线和散点之间的位置关系,你有什么发现或者猜测。
①代码
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_boston # 加载数据集 boston = load_boston() data = boston.data target = boston.target # 选择属性NOX、RM和LSTAT,每一列为一个属性或房价 subset = data[:, [4, 5, 12]] subset = np.hstack((subset, target.reshape(-1, 1))) # 绘制散点图 plt.scatter(subset[:, 0], subset[:, 3], alpha=0.5) plt.xlabel('RM') plt.ylabel('Price') plt.show() # 计算w和b x = subset[:, 0].reshape(-1, 1) y = subset[:, 3].reshape(-1, 1) x_mean = np.mean(x) y_mean = np.mean(y) w = np.sum((x - x_mean) * (y - y_mean)) / np.sum((x - x_mean) ** 2) b = y_mean - w * x_mean print("w的值为:%.2f" % w) print("b的值为:%.2f" % b) # 绘制直线 x_range = np.linspace(np.min(x), np.max(x), 100).reshape(-1, 1) y_pred = w * x_range + b plt.scatter(subset[:, 0], subset[:, 3], alpha=0.5) plt.plot(x_range, y_pred, color='red', linewidth=2) plt.xlabel('RM') plt.ylabel('Price') plt.show()
②实验结果
实验结果自己截图
③常见错误
如遇到以下错误
load_boston` has been removed from scikit-learn since version 1.2
也就是1.2库中的load_boston方法被移除。可以先把安装的scikit包卸载了,然后在终端里运行下面指令
pip install scikit-learn==1.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
它也有可能让你升级pip,复制提示给你的指令在终端里运行,之后再运行上面的代码,即可解决
题目二:
使用TensorFlow张量运算计算**w**和**b**,并输出结果。(20分)
已知:
** x**=[ 64.3, 99.6, 145.45, 63.75, 135.46, 92.85, 86.97, 144.76, 59.3, 116.03]
** y**=[ 62.55, 82.42, 132.62, 73.31, 131.05, 86.57, 85.49, 127.44, 55.25, 104.84]
计算:
其中,xi是**x**中索引值为**i**的元素;是**y**中索引值为**i**的元素;**n**是张量中元素的个数;
(3)分别输出w和b的结果。
①代码
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 定义数据 x = tf.constant([64.3, 99.6, 145.45, 63.75, 135.46, 92.85, 86.97, 144.76, 59.3, 116.03]) y = tf.constant([62.55, 82.42, 132.62, 73.31, 131.05, 86.57, 85.49, 127.44, 55.25, 104.84]) # 计算w和b n = tf.cast(tf.shape(x)[0], tf.float32) w = (n * tf.reduce_sum(x * y) - tf.reduce_sum(x) * tf.reduce_sum(y)) / (n * tf.reduce_sum(x ** 2) - tf.reduce_sum(x) ** 2) b = (tf.reduce_sum(y) - w * tf.reduce_sum(x)) / n # 输出w和b print("w的值为:%.2f" % w.numpy()) print("b的值为:%.2f" % b.numpy())
②实验结果
自己截图
题目三
已知:
x1=[137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00,114.00, 106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21] x2=[3, 2, 2, 3, 1, 2, 3, 2, 2, 3, 1, 1, 1, 1, 2, 2] y =[145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00,91.00, 62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.30]
按要求计算:(20分)
(1)创建一个16×3的二维数组X,其中第一列全为1,第二列和第三列中分别为数组x1和x2中的数据,并输出。
(2)将数组y转换为16×1的二维数组Y,并输出。
(3)根据前两问得出的X和Y,利用如下公式,求W
①代码
import numpy as np # 定义数据 x1 = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00, 106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21]) x2 = np.array([3, 2, 2, 3, 1, 2, 3, 2, 2, 3, 1, 1, 1, 1, 2, 2]) y = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00, 62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.30]) # (1)创建16×3的二维数组X,并输出 X = np.column_stack((np.ones_like(x1), x1, x2)) print("X的值为:\n", X) # (2)将数组y转换为16×1的二维数组Y,并输出。 Y = y.reshape(-1, 1) print("Y的值为:\n", Y) # (3)根据前两问得出的X和Y,求W。 XT_X = X.T.dot(X) # 计算X转置乘以X XT_Y = X.T.dot(Y) # 计算X转置乘以Y W = np.linalg.inv(XT_X).dot(XT_Y) # 求解W print("W的值为:\n", W)
②实验结果
自己截图
4、实验小结&讨论题
① 实验过程中遇到了哪些问题,你是如何解决的?
** **没遇到问题
② 在实现数组运算时,采用NumPy和TensorFlow各有什么特点?你认为编程时如何选择或使用它们更合理?需要注意哪些问题?
在实现数组运算时,NumPy和TensorFlow都有其特点。NumPy是Python中最重要的科学计算库之一,提供了多维数组、矩阵等数值计算功能,具有良好的数据处理能力和高效的计算性能,并且拥有丰富的函数库,可以进行数据加工、处理、筛选等操作。而TensorFlow则是一个由Google开发的机器学习框架,可以用来构建和训练神经网络等深度学习模型,提供灵活的数据流图模型,支持分布式计算和高效的GPU加速,专注于可扩展性和生产环境部署。 在采用NumPy和TensorFlow时,需要结合具体的应用场景进行考虑,如果只是需进行简单的计算和处理时,使用NumPy较为合适; 如果涉及到深度学习等领域,则可以考虑使用TensorFlow。有些情况下两者也可能同时使用,比如使用TensorFlow的API对数据进行预处理、数据归一化等操作后,再将其转换为NumPy数组进行处理。在选择或使用时,需要注意库的正确安装、数据类型和维度匹配、内存占用和性能、算法的正确性以及合理利用官方文档和社区资源等问题,以避免出现错误结果。
③ 在题目基本要求的基础上,你对每个题目做了那些扩展和提升?或者你觉得在编程实现过程中,还有哪些地方可以进行优化?(可以从如何提高代码的简洁度来谈谈这个问题)
完全按题目要求,没有改进与提升
版权归原作者 Specium. 所有, 如有侵权,请联系我们删除。