线性回归算法

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))

  

  
posted @ 2023-03-11 22:00  NAVYSUMMER  阅读(55)  评论(0)    收藏  举报
交流群 编程书籍