一元线性回归
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()
她面对着一望无际的蔚蓝色的大海;那灰白色的灯塔,矗立在远处朦胧的烟光雾色之中;在右边,视力所及之处,是那披覆着野草的绿色沙丘,它在海水的激荡下渐渐崩塌,形成一道道柔和、低回的皱折;那夹带泥沙的海水,好像不停地向杳无人烟的仙乡梦国奔流。”
——弗吉尼亚·伍尔芙《到灯塔去》