5.6.2 批量梯度下降法的代码实现
在开始代码之前,我们首先介绍一个numpy的小技巧:矩阵的展平。这里使用到的是numpy中的ravel函数,ravel的中文翻译是拆开,解开的意思。它就是将矩阵拆开成一个列向量。比如我们执行如下的代码:
import numpy as np
a = np.arange(81)
a = a.reshape(9,9)
print(a)
a = a.ravel()
print(a.shape)
我们可以清楚地看到一个的矩阵被拆开成了一个列向量,形状为 (81,) 。
为什么要这么做?
因为计算机的内存是有序排列的,如果存储矩阵,我们知道可以用两个指标来获得矩阵中的一个值。这就意味着在数据结构上有两个互相关联的索引。这种开销虽然看上去很小,但对于很大的数据来说,开销变得极其巨大。但是如果展平了矩阵,使得它仅仅使用一个索引来存储,这就在计算中节省了很多的内存开销。所以,我们为了计算的效率,一般会将矩阵展平来操作。值得注意的是,另一个强大的计算机语言Matlab,它的强大的矩阵计算甚至可以达到C语言的速度。其本质的原因就在于它的存储本身就是将矩阵展平的。而且它虽然表面上是用行列指标来确定矩阵中的某个值,但实际上却是用乘法得到单指标来确定的。所以,这种存储方式决定了计算速度的提高。
所以我们也来对梯度下降法的数据处理部分进行改进。我们之前的数据处理是这段代码:
import numpy as np
cost_of_material = np.array([38.3, 35, 31.2, 43.2, 44.2, 41.2])
cost_of_sales = np.array([12.3, 11.2, 10.1, 9.2, 9.1, 9.6])
cost_of_human = np.array([22,21.3,23.7,23.2,20.5,24.2])
cost_of_product = np.array([7.2, 7.8, 8.3, 8.6, 8.8, 9.3])
sell_price = np.array([100.1, 102, 99.2, 101.2, 103.8, 100.5])
# 数据正规化,由于都是钱计价的,所以可以用同一个单位来正规化,比如这里使用100, 也可以不正规化,这里使用是为了提示你必须先考虑特征的正规化。
cost_of_material /= 100
cost_of_sales /= 100
cost_of_human /= 100
cost_of_product /= 100
sell_price /= 100
# 预设权重
weights = np.array([0.6,0.2,0.8,0.9])
# 学习速率
learning_rate = np.array([0.5,0.5,0.5,0.5])
# 转换成矩阵形式
raw_data = np.vstack((cost_of_material,cost_of_sales,cost_of_human,cost_of_product))
raw_data = raw_data.T
print(raw_data)
可以看到,raw_data是一个 的矩阵。
网友评论