线性回归算法
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))