前面有的是手做的笔记,后期有时间出个详细讲解版(个人理解,数学计算真的需要一步一步进行计算)
向量化
向量化对于程序的改进是非常直观地,在理清前面老师捋的梯度下降算法的过程之后,开始讲向量化,向量化的出现主要就是针对for循环的(我们很喜欢,但是效率很低)
行吧虽然我的和老师比效率也不高,但是可以看出有小十倍的算力差距
(重新跑了一遍上面的,时间从3降到1.9了,开心!)
代码段1
import numpy as np
a=np.array([1,2,3,4])
print(a)
代码段2
# 标准向量化版本
import time
a=np.random.rand(1000000)
b=np.random.rand(1000000)
tic=time.time()
c=np.dot(a,b)
toc=time.time()
print("标准化表达"+str(1000*(toc-tic))+"ms")
print(c)
代码段3
# 非标准向量化版本
c=0
tic=time.time()
for i in range(1000000):
c+=a[i]*b[i]
toc=time.time()
print("非标准化表达"+str(1000*(toc-tic))+"ms")
print(c)
这只是一点点代码,以后数据量多了能跑好几天的,也就是尽量向量化
将两个for循环缩减为一个,提高运算效率
这个就是把上面的代码优化
dw=np.zeros((n-x,1))
初始化都是0,n-x行1列的向量(就是dw1和dw2的定义)
下面也是,标上上标区别w就行
广播的例子
这个本来的例子是苹果鸡蛋牛肉巴拉巴拉的有时间整理
定义一个矩阵,对每列进行求和,将每列里面的元素分别除以每列的total
import numpy as np
A=np.array([[56.0,0.0,4.4,68.0],
[1.2,104.0,52.0,8.0],
[1.8,135.0,99.0,0.9]])
print(A)
cal=A.sum(axis=0)//表达我们要在垂直方向求和,假如axis=1说明在水平方向求和
print(cal)
percentage=100*A/cal.reshape(1,4)
print(percentage)
这一部分是老师给出尽量减少bug的建议
比如这个,一开始假如没有定义好矩阵的维度,就很容易导致代码不知道应该是谁成谁的转置
所以定义好