吴恩达老师在深度学习课程第二课2.3节指数加权平均中讲了,指数加权平均的近视值可看作是最近(1/(1-B))天气温的平均值,故而绘制指数加权平均和近视值的图像,给出直观感觉;另外给出对指数加权平均修正偏差后的图像和最普通的气温平均值的图像。
导入相关模块:
import numpy as np
import matplotlib.pyplot as plt
#将图表嵌入Notebook
%matplotlib inline
#使用inline模式的图表在Notebook中会自动关闭,使用以下魔法命令可以在多个单元格内操作同一幅图表
%config InlineBackend.close_figures = False
plt.rcParams['figure.dpi'] = 200 #设置分辨率
创建数据:
X = np.arange(1, 366, 1) #365天,np.arange分配在[1,366)步长为1的等差数列
y1 = np.linspace(20, 38, 200) #20°-38°,np.linspace在[20,38)区间分配内200个数的等差数列
y2 = np.linspace(38, 0, 165) #38°-0°
Y = np.append(y1, y2) + np.random.normal(3, 2, (365,)) #将两个数组拼接起来,并加上一个标准差为3,方差为2的正态分布的数组
绘制气温的散点图(默认蓝色):
plt.scatter(X, Y,s = 1)
plt.show()
指数加权平均:
# B属于[0,1]
def exponentlyWeightAverages(Y,B = 0.9):
'''指数加权平均'''
# 超参数 B = 0.9, y = 0
y = 0
newY = []
for theta in Y:
y = B * y + (1 - B) * theta
newY.append(y)
return newY
绘制指数加权平均的曲线图(红色):
newY = exponentlyWeightAverages(Y)
plt.plot(X, newY, c = 'r', linewidth = 2)
plt.show()
可以看到前面几天的数据有很大的bias(偏差):
print(Y[0])
print(newY[0])
#结果是
#22.64442208583385
#2.264442208583384
刚好相差10倍,下面进行偏差修正。
偏差修正:
def biasCorrection(Y, B = 0.9):
'''偏差修正'''
c = 0
newC = []
for i in range(Y.shape[0]):
c = B * c + (1 - B) * Y[i]
bc = c / (1 - B**(i+1))
newC.append(bc)
return newC
绘制偏差修正后的曲线图(黑色):
newC = biasCorrection(Y)
plt.plot(X, newC, c = 'black', linewidth = 1)
plt.show()
指数加权平均的近视值:
def approximation(Y, B = 0.9):
'''指数加权平均的近视值可看作是最近(1/(1-B))天的平均值'''
num = int(1/(1-B))
k = 0
newK = []
for i in range(Y.shape[0]):
sum = 0
for j in range(num):
if i>= j:
sum = sum + Y[i-j]
if i < num:
sum /= (i+1)
else:
sum /= num
newK.append(sum)
return newK
绘制近视值的曲线图(绿色):
newK = approximation(Y)
plt.plot(X, newK, c = 'g', linewidth = 2)
plt.show()
平均值:
def averages(Y):
'''前面所有天气温的平均值'''
m = 0
newM = []
for i in range(Y.shape[0]):
m = (m * i + Y[i]) / (i+1)
newM.append(m)
return newM
绘制平均值的曲线图(黄色):
newM = averages(Y)
plt.plot(X, newM, c = 'y', linewidth = 1)
plt.show()
参考文章