一元线性回归

import numpy as np 
import matplotlib.pyplot as plt 
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
# 平方损失函数 Loss = (y-(wx+b))^2/2
# 均方损失函数 Loss = (y-(wx+b))^2/2n
# Loss对w和b的偏导为零,则Loss最小
# create data
x = np.array([137.97,104.50,100.00,142.32,79.20,99.00,124.00,114.00,106.96,139.02,53.75,46.91,68.00,63.02,81.26,86.21, 100.00])
y = np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,78.50,69.65,75.69,95.30])
learn_rate = 0.00001 #学习率
iter = 1000 #迭代次数
display_step = 10 #显示步长
# 设置模型参数初值
np.random.seed(612)
w = np.random.randn() #返回一个正态分布的浮点数,为空随机生成一个数字
b = np.random.randn()
mse = [] #存放损失
for i in range(0, iter+1):
    dl_dw = np.mean(x*(w*x+b-y))
    dl_db = np.mean(w*x+b-y)
    w = w - learn_rate * dl_dw
    b = b - learn_rate * dl_db
    pred = w*x + b
    Loss = np.mean(np.square(y - pred))/2
    mse.append(Loss)
    # 绘制loss函数
    plt.plot(x, pred)
    if(i % display_step == 0):
        print("i:%i, Loss:%f, w: %f, b:%f"%(i, mse[i],w,b))
# 绘图
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.figure()
plt.scatter(x,y,color = 'red',label='销售纪录')
plt.plot(x,pred,color='blue')
plt.xlabel('Area', fontsize=14)
plt.ylabel('Price', fontsize=14)
plt.legend(loc='upper left')
plt.figure()
plt.plot(mse[0:100])
plt.xlabel('Iter',fontsize = 14)
plt.ylabel('loss', fontsize = 14)
plt.show()

多元线性回归


import numpy as np 
import matplotlib.pyplot as plt 
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

# 线性归一化: x* = (x-min)/(max-min)
# 标准差归一化: x* = (x-u)/a, 将数据归一化为均值为0,方差为1的正态分布


# 获取数据
x = np.array([137.97,104.50,100.00,142.32,79.20,99.00,124.00,114.00,106.96,139.02,53.75,46.91,68.00,63.02,81.26,86.21, 100.00])
_x = np.array([3,2,2,3,1,2,3,2,2,3,1,1,1,1,2,2,2])
y = np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,78.50,69.65,75.69,95.30])

num = len(x)
# 数据处理
x0 = np.ones(num)
x1 = (x-x.min())/(x.max()-x.min())
x2 = (_x-_x.min())/(_x.max()-_x.min())

X = np.stack((x0,x1,x2), axis=1)
Y = y.reshape(-1,1)

# 设置参数
learn_rate = 0.001
iter = 500
display_step = 50

# 设置模型参数初始值
np.random.seed(111)
W = np.random.randn(3,1)

# 训练模型
mse = []
for i in range(0, iter+1): 
    # matmul返回两个矩阵的乘积
    dl_dw = np.matmul(np.transpose(X), np.matmul(X, W)-Y) #计算偏导数
    W = W - learn_rate*dl_dw #更新权值

    pred = np.matmul(X, W) #计算估计值
    Loss = np.mean(np.square(Y - pred))/2 #计算损失函数
    mse.append(Loss)
    if i % display_step == 0:
        print("i:%i, Loss:%f"%(i, mse[i]))
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.subplot(1,2,1)
plt.plot(mse)
plt.xlabel('iter', fontsize=14)
plt.ylabel('loss', fontsize = 14)

plt.subplot(1,2,2)
pred = pred.reshape(-1)
plt.plot(y, color='red', marker='o',label='记录')
plt.plot(pred, color='blue', marker='o',label='价格')
plt.xlabel('Sample', fontsize=14)
plt.ylabel('Price', fontsize=14)
plt.legend()
plt.show()

她面对着一望无际的蔚蓝色的大海;那灰白色的灯塔,矗立在远处朦胧的烟光雾色之中;在右边,视力所及之处,是那披覆着野草的绿色沙丘,它在海水的激荡下渐渐崩塌,形成一道道柔和、低回的皱折;那夹带泥沙的海水,好像不停地向杳无人烟的仙乡梦国奔流。”

——弗吉尼亚·伍尔芙《到灯塔去》