线性回归算法
1.算法原理
y=w*x+b+ε
loss=Σ(w*xi+b-yi)2
w'=w-lr*(loss对w求偏导) # 梯度下降算法
b'=b-lr*(loss对b求偏导) # 梯度下降算法
2.基于numpy实现
def compute_loss(b,w,points):
loss = 0
n = len(points)
for i in range(n):
x = points[i,0]
y = points[i,1]
loss += (y-(w*x+b))**2
return loss/n
def step_gradient(current_b,current_w,points,learning_rate):
b_gradient = 0
w_gradient = 0
n = len(points)
for i in range(0,n):
x = points[i,0]
y = points[i,1]
# grad_b = 2*(w*x+b-y)
b_gradient += (2/n)*((current_w*x+current_b)-y)
# grad_w = 2*(w*x+b-y)*x
w_gradient += (2/n)*x*((current_w*x+current_b)-y)
current_b = current_b - learning_rate * b_gradient
current_w = current_w - learning_rate * w_gradient
return current_b,current_w
def gradient_descent_runner(points,start_b,start_w,learning_rate,num):
b = start_b
w = start_w
for _ in range(num):
b,w = step_gradient(b,w,np.array(points),learning_rate)
return b,w
def run():
points = np.genfromtxt("data.csv",delimiter=",")
learning_rate = 0.0001
b = 0
w = 0
num = 1000
loss = compute_loss(b,w,points)
print(w,b,loss)
b,w = gradient_descent_runner(points,b,w,learning_rate,num)
loss = compute_loss(b,w,points)
print(w,b,loss)
3.基于tensorflow实现
import os
import tensorflow as tf
from tensorflow import keras
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
(X, Y), _ = keras.datasets.mnist.load_data()
X = tf.convert_to_tensor(X, dtype=tf.float32) / 256
Y = tf.convert_to_tensor(Y, dtype=tf.int32)
print(X.shape, Y.shape)
print(tf.reduce_min(X), tf.reduce_max(X))
print(tf.reduce_min(Y), tf.reduce_max(Y))
train_data = tf.data.Dataset.from_tensor_slices((X, Y)).batch(128)
train_iter = iter(train_data)
sample = next(train_iter)
print("bath:", sample[0].shape, sample[1].shape)
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))
w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))
b2 = tf.Variable(tf.zeros([128]))
w3 = tf.Variable(tf.random.truncated_normal([128, 10], stddev=0.1))
b3 = tf.Variable(tf.zeros([10]))
lr = 1e-3
for epoch in range(10):
for step, (x, y) in enumerate(train_data):
x = tf.reshape(x, [-1, 28 * 28])
with tf.GradientTape() as gt:
h1 = x @ w1 + b1
h1 = tf.nn.relu(h1)
h2 = h1 @ w2 + b2
h2 = tf.nn.relu(h2)
out = h2 @ w3 + b3
y_one_hot = tf.one_hot(y, depth=10)
# 均方差 = mean(sum(y-out)^2)
loss = tf.reduce_mean(tf.square(y_one_hot - out))
grads = gt.gradient(loss, [w1, b1, w2, b2, w3, b3])
# w1 = w1 - lr*w1_grad
w1.assign_sub(lr * grads[0])
b1.assign_sub(lr * grads[1])
w2.assign_sub(lr * grads[2])
b2.assign_sub(lr * grads[3])
w3.assign_sub(lr * grads[4])
b3.assign_sub(lr * grads[5])
if step % 100 == 0:
print(epoch, step, "loss:", float(loss))

浙公网安备 33010602011771号