在本练习中,您将 实现线性回归并了解其在数据上的工作原理。
在开始练习前,需要下载如下的文件进行数据上传:
ex1data1.txt -单变量的线性回归数据集 ex1data2.txt -多变量的线性回归数据集在整个练习中,涉及如下的必做作业,及标号*的选做作业:
实现简单示例函数----------(5分) 实现数据集显示的函数-------(5分) 计算线性回归成本的函数-----(40分) 运行梯度下降的功能函数-----(50分) 数据标准化* 多变量线性回归的梯度下降功能实现*必做作业为实现单变量的线性回归;选做作业为实现多变量线性回归。
在该部分练习中,将通过代码实现返回一个5*5的对角矩阵。输出与如下相同:
1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
在以下代码框中进行如上的实现,完成部分练习后,得到如上的相同结果即为通过。
import numpy as np def create_identity_matrix(size): matrix = [] for i in range(size): row = [0] * size row[i] = 1 matrix.append(row) return matrix def print_matrix(matrix): for row in matrix: print(' '.join(map(str, row))) identity_matrix = create_identity_matrix(5) print_matrix(identity_matrix)
1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
在该部分练习中,将实现单变量线性回归并用来预测餐车的利润。
假设你是一家餐厅的领导,正在考虑在不同的城市开设新的分店。该连锁店已经在不同的城市有了餐车,并且你能够获得每个城市的人口和利润数据。
现在需要使用这些数据来帮助你选择下一个被扩展的城市。
文件ex1data1.txt包含线性回归问题的数据集。第一列数据对应城市人口,第二列数据对应那座城市的餐车的利润。利润为负时表示亏损。
在开始进入练习之前,对数据进行可视化通常很有用。对于该数据集,可以使用散点图进行可视化,因为它只有两个属性(人口、利润)。
import numpy as np import pandas as pd import matplotlib.pyplot as plt import os %matplotlib inline
path = 'ex1data1.txt' data = pd.read_csv(path, header=None,names=['Population','Profit']) data.head(5) Population Profit 0 6.1101 17.5920 1 5.5277 9.1302 2 8.5186 13.6620 3 7.0032 11.8540 4 5.8598 6.8233
接下来需要实现数据可视化的代码,该部分数据绘制出的图像应与如下相同。
要点:
实现散点图可视化 数据分布为红色点 标清横纵坐标名称
plt.figure(figsize=(8, 6)) plt.scatter(data['Population'], data['Profit'], color='red') plt.title('Population vs Profit', fontsize=14) plt.xlabel('Population', fontsize=12) plt.ylabel('Profit', fontsize=12) plt.show()
在该部分中,将使用梯度下降来选择合适的线性回归参数θ用以拟合给定数据集。
2.2.1 更新公式线性回归的目的是最小化成本函数:
假设由以下线性模型给出:
回顾一下,模型的参数是的值,这些将用来调整以最小化成本。
其中一种方法是使用批量梯度下降算法,在批量梯度下降中,每次迭代地执行更新,随着梯度下降的每一步计算,参数越来越接近能够使得成本达到最低的最佳值。
(同时更新所有的)
2.2.2 实现在上一部分的练习中,我们已经将所需要用到的数据加载至变量data中,并为其列分别进行命名。
接下来,我们在数据中添加了一个维度来拟合截距项。并将初始参数值设为0,学习率设为0.01。
data.insert(0, 'Ones', 1) cols = data.shape[1] X = data.iloc[:,0:cols-1] y = data.iloc[:,cols-1:cols] X = np.matrix(X.values) y = np.matrix(y.values) alpha = 0.01 iterations = 1500
print(X.shape, type(X)) print(X) print(X.shape, type(X)) print(X)
(97, 2) <class 'numpy.matrix'> [[ 1. 6.1101] [ 1. 5.5277] [ 1. 8.5186] [ 1. 7.0032] [ 1. 5.8598] [ 1. 8.3829] [ 1. 7.4764] [ 1. 8.5781] [ 1. 6.4862] [ 1. 5.0546] [ 1. 5.7107] ... [ 1. 5.0594] [ 1. 5.7077] [ 1. 7.6366] [ 1. 5.8707] [ 1. 5.3054] [ 1. 8.2934] [ 1. 13.394 ] [ 1. 5.4369]] (97, 2) <class 'numpy.matrix'> [[ 1. 6.1101] [ 1. 5.5277] [ 1. 8.5186] [ 1. 7.0032] ... [ 1. 7.6366] [ 1. 5.8707] [ 1. 5.3054] [ 1. 8.2934] [ 1. 13.394 ] [ 1. 5.4369]] 2.2.3 计算成本J(θ)
在执行梯度下降最小化成本函数时,通过计算成本来监视收敛状态是有帮助的。
在该部分练习任务中,你需要实现一个计算成本的函数computeCost,用于检查梯度下降实现的收敛性。
其中,X和y不是标量值,而是矩阵,其行代表训练集中的示例。
要点:
完成该函数后,将值初始化为0并进行成本的计算,将得到的成本值打印出来。
如果结果为32.07,则计算通过。
theta = np.zeros((X.shape[1],1)) def computeCost(theta, X, y): m = len(y) inner = X @ theta - y square_sum = np.sum(np.square(inner)) cost = square_sum / (2 * m) return cost; cost = computeCost(theta, X, y) print(cost)
32.072733877455676 2.2.4 梯度下降
接下来,我们将实现梯度下降,给出的代码已经实现了循环结构,你只需要在每次的迭代中提供的更新。
在进行代码实现时,请确保你了解要优化的内容,和正在更新的内容。
请记住,成本为参数-被向量终止,而不是和。也就是说,我们将的值最小化通过改变矢量的值,而不是通过改变或。
验证梯度下降是否正常工作的一种好方法是查看的值,并检查该值每步是否减小。每次迭代时,代码都会调用computeCost函数并打印成本。假设你实现了梯度下降,正确地计算成本,值永远不会增加,并且应该在算法结束时收敛到稳定值。
要点:
实现梯度下降后,需要使用最终的参数值将线性回归的拟合结果进行可视化,绘图结果需要类似如下图所示。
def gradient(theta, X, y): m = X.shape[0] inner = X.T @ (X @ theta - y) return inner / m def batch_gradient_decent(theta, X, y, iterations, alpha): cost_data = [computeCost(theta, X, y)] _theta = theta.copy() for _ in range(iterations): _theta = _theta - alpha * gradient(_theta, X, y) cost_data.append(computeCost(_theta, X, y)) return _theta, cost_data
_theta, cost_data = batch_gradient_decent(theta, X, y, iterations, alpha) print(_theta) computeCost(_theta, X, y)
[[-3.63029144] [ 1.16636235]] 4.483388256587726
cost_data
[32.072733877455676, 6.737190464870006, 5.931593568604956, 5.901154707081388, 5.895228586444221, 5.89009494311733, 5.885004158443647, 5.879932480491418, 5.874879094762575, ... 4.516522271846125, 4.516379811801644, 4.516237864890023, 4.516096429262984, ...]
plt.scatter(data['Population'], data['Profit'], color='red', label='Training data') plt.plot(data['Population'], X @ _theta, label='Linear regression fit', color='blue') plt.xlabel('Population') plt.ylabel('Profit') plt.title('Linear Regression Fit') plt.legend() plt.show()
为了更好地理解成本函数的迭代计算,将每一步计算的cost值进行记录并绘制。
fig, ax = plt.subplots(figsize=(12,8)) ax.plot(np.arange(iterations+1), cost_data, 'r') ax.set_xlabel('Iterations') ax.set_ylabel('Cost') ax.set_title('Cost Function Convergence')
Text(0.5, 1.0, 'Cost Function Convergence')
在该部分中,将使用多个变量来实现用线性回归预测房屋价格。假设你目前正在出售房屋,想知道什么是好的市场价格。
一种方法是首先收集最近出售房屋的信息,其次是建立房屋价格模型。
文件ex1data2.txt包含俄勒冈州波特兰市的房屋价格及相关信息。第一列是房屋的大小(以平方英尺为单位),第二列是卧室的个数,第三列是房屋的价格。
以下代码将从文件ex1data2.txt文件中加载并显示该数据集。
通过观察这些数据,可以发现房屋的大小大约是卧室数量的1000倍。而当不同的特征值之间相差几个数量级时,将特征进行缩放可以使梯度下降收敛得更快。
path = 'ex1data2.txt' data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price']) data2.head() Size Bedrooms Price 0 2104 3 399900 1 1600 3 329900 2 2400 3 369000 3 1416 2 232000 4 3000 4 539900
在该部分练习中,你的任务是编写代码并实现数据集中的数据标准化。
要点:
从数据集中减去每个特征的平均值。 减去平均值后,再将新的特征值除以各自的“标准差”标准差是一种衡量特定特征的值的范围内有多大变化的方法(大多数数据点将位于平均值的两个标准差内);这是取值范围的替代方法。
当标准化特征时,需要存储用于标准化的值——平均值和标准差。从模型中学习参数后,经常需要预测新的房屋的价格。此时给定一个新的值(房屋面积和卧室数量),必须首先使用先前从训练集中计算的平均值和标准差来对新的数据进行标准化。
def get_X(df): ones = pd.DataFrame({'ones': np.ones(len(df))}) data = pd.concat([ones, df], axis=1) return data.iloc[:, :-1].values def get_y(df): return np.array(df.iloc[:, -1]) def normalize_feature(df): return df.apply(lambda column: (column - column.mean()) / column.std()) data = normalize_feature(data2) data.head() Size Bedrooms Price 0 0.130010 -0.223675 0.475747 1 -0.504190 -0.223675 -0.084074 2 0.502476 -0.223675 0.228626 3 -0.735723 -1.537767 -0.867025 4 1.257476 1.090417 1.595389 3.2 梯度下降
在之前的练习中,我们使用单变量线性回归实现了梯度下降的问题。在该部分联系中,唯一的区别是,此时我们的数据变为矩阵。
假设函数和批次梯度下降的更新规则保持不变,你的任务是代码实现多变量线性回归的成本函数和梯度下降。
要点:
确保你的代码中可以支持任何大小的数据,并且数据均已被向量化。 代码实现成本函数和梯度下降后,最终的成本值应大约为0.13。 请依照单变量线性回归练习中要求,绘制成本的变化曲线。import seaborn as sns X = get_X(data) print(X.shape, type(X)) y = get_y(data) print(y.shape, type(y)) theta = np.zeros(X.shape[1]) epoch = 1500 alpha = 0.01 final_theta, cost_data = batch_gradient_decent(theta, X, y, epoch, alpha = alpha) sns.tsplot(time = np.arange(len(cost_data)), data = cost_data) plt.xlabel('epoch', fontsize = 18) plt.ylabel('cost', fontsize = 18) plt.show() final_theta
(47, 3) <class 'numpy.ndarray'> (47,) <class 'numpy.ndarray'> /opt/conda/lib/python3.6/site-packages/seaborn/timeseries.py:183: UserWarning: The `tsplot` function is deprecated and will be removed in a future release. Please update your code to use the new `lineplot` function. warnings.warn(msg, UserWarning) /opt/conda/lib/python3.6/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result. return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
array([-1.10833328e-16, 8.84042349e-01, -5.24551809e-02]) 练习1:线性回归 介绍 1 实现简单示例函数 1.1 提交解决方案 2 单变量线性回归 2.1 绘制数据 2.2 梯度下降 2.2.1 更新公式 2.2.2 实现 2.2.3 计算成本J(θ) 2.2.4 梯度下降 2.3 可视化成本函数 选做练习 3 多变量线性回归 3.1 特征标准化 3.2 梯度下降
__EOF__
本文作者: HJDSSJ 本文链接: https://www.cnblogs.com/hjdssj/p/18585819 关于博主: 评论和私信会在第一时间回复。或者直接私信我。 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。
相关知识
环境适应性评分的机器学习模型
中老年人瑜伽练习不再难,梵悦智能机器人教练来帮忙
三行情书:线性回归分析快速成文法
肌肉练习器
基于机器学习的冠心病风险预测模型构建与比较
Isha瑜伽:回归纯粹的古典瑜伽科学
人工智能和机器学习在健康行业中的应用
《柔韧练习》教学设计2
女人腹部线怎么练习
想塑造腰线可以练习哪些瑜伽
网址: 机器学习:线性回归练习 https://m.trfsz.com/newsview484985.html