python numpy.diff_python numpy 手撸简单线性回归

线性回归原理:

Loss Function:

Gradient Update:

lr为学习率,w和b的梯度就是对loss function的求导【这里为手动求解导数后,放入公式,也用diff进行计算】

代码思路:

产生假数据

计算y的预测值

计算loss值及梯度计算和更新

画图展示

代码:

import numpy as np

import matplotlib.pyplot as plt

def get_fake_data(iter,show=False):

X = np.random.rand(iter)*20

noise = np.random.randn(iter)

y = 0.5 * X + noise

if show:

plt.scatter(X,y)

plt.show()

return X,y

def count_y_prediction(X, w, b):

y_pred = w*X + b

# print(y_pred)

return y_pred

def compete_error_for_given_points(y, y_pred):

error = (y - y_pred) ** 2

error = error.sum() / len(y)

# print(error)

return error

def compete_gradient_and_update(X, w, b, lr):

w_gradient = 0

b_gradient = 0

N = len(X)

for i in range(N):

w_gradient += 2 * (w * X[i] + b - y[i]) * X[i]

b_gradient += 2 *(w * X[i] + b - y[i])

w -= lr * w_gradient / N

b -= lr * b_gradient / N

return w,b

def linaerRegression(X, y, w, b, i, lr = 0.001):

# print(w,b)

y_pred = count_y_prediction(X, w, b)

error = compete_error_for_given_points(y, y_pred)

print("loss:", error)

w, b = compete_gradient_and_update(X, w, b, lr)

# print(w,b)

y_pred = count_y_prediction(X, w, b)

draw(X, y, y_pred)

def draw(X, y, y_pred,final=True):

# plt.ion()

plt.clf()

plt.scatter(X, y, c="blue")

plt.plot(X, y_pred, c="blue")

if final:

plt.pause(0.2)

# plt.close()

else:

plt.show()

if __name__ == "__main__":

iter = 50

X,y = get_fake_data(iter)

w = np.random.randn(1)

b = np.zeros(1)

plt.ion()

for i in range(30):

linaerRegression(X, y, w, b, i)

plt.ioff()

y_pred = count_y_prediction(X, w, b)

draw(X,y,y_pred,0)

结果

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>