通过这个笔记记录以下学习的过程。
在使用python实现机器学习,可以使用anaconda (清华镜像下载)去实现。
线性回归是常见的拟合算法,本文通过梯度下降实现数据拟合。
1.到入库
import numpy as np #导入数据处理模块numpy
import matplotlib.pyplot as plt #绘图模块
2. 产生随机数据
x = np.arange(-2, 2, 0.1) # -2到2按照0.1为步距
length = len(x)
y = 2*x+4+(np.random.random(length)-0.5)*3 #y=2*x+4 加上随机数
x = x.reshape(length, 1)
y = y.reshape(length, 1)
plt.figure()
plt.scatter(x, y)
plt.show()
效果图:
image.png
3.梯度下降
(这一块内容推荐看吴恩达视频分析。)
在求取线性回归的过程中,最主要步骤是使得预测值和样本值之间的差异最小,如下公式表示样本和预测值之间的差值平方。1/2参数是为了求导时与平方2约去。
image.png
对m b进行求导
image.png
记err = h(x[i]) - y[i],则得到:
m,b的导数分别时 err*x 和 err
得到导数之后,就需要使得m,b朝着使得ERROR值小的方向变化。下面结合代码分析:
m = 1 #m, b初始化 一般用随机值
b = 0
learning_rate = 0.005 #学习率
def gredient(x, y, m, b) :
for i in range(0, length) :
err = (m*x[i] + b) - y[i]
m -= err * x[i] * learning_rate
b -= err * learning_rate
return [m, b]
#训练次数
times = 100
for i in range(times) :
m, b = gredient(x, y, m, b)
print(m, b)
#绘制最终结果
x_b = [-2,2]
y_b = [-2*m + b,2*m +b]
plt.figure()
plt.plot(x_b, y_b)
plt.scatter(x, y)
plt.show()
对样本进行遍历时,更新m,b的值,这个变化的值由导数(理解为斜率)和learning_rate(理解为斜率方向移动步长)组成。
实验结果:
image.png
image.png
网友评论