以下是看了mooc上西安科技大学的tensorflow2.0的实战课程后做的笔记:(内容不难,但也要理解)
假设房价只受到房间面积的影响,即只有一个自变量。
确定模型:y=wx+b
模型变量:x
模型参数:w:权重(weights) b:偏置值(bias)
损失函数:估量模型的预测值和真实值的不一致程度,常用的是平方损失函数
我们要求出w和b,使得损失函数最小,实际也就是一个求极值问题,而极值点的偏导数为0。通过以下步骤得到w和b的表示形式:
如何实现预测?
我们要根据已知的样本点(x,y)和建立的模型y=wx+b求出w,b即可求解我们的模型。这时再给模型输入新的x,就可求出y。也就是得到一个预测的结果y,即房价。
方法一:纯python实现(效率较低)
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 10 10:36:17 2020
一元线性回归--房价预测--Python方法实现
@author: 16577
"""
#第一步:加载样本数据
##x代表商品房面积
x=[137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,
46.91,68.00,63.02,81.26,86.21]
##y代表房价
y=[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,69.65,75.69,95.30]
#第二步:根据学习模型--计算w,b
meanX=sum(x)/len(x)#求x的均值
meanY=sum(y)/len(y)#求y的均值
sumXY=0.0
sumX=0.0
for i in range(len(x)):
sumXY+=(x[i]-meanX)*(y[i]-meanY)#求分子
sumX+=(x[i]-meanX)*(x[i]-meanX)#求分母
w=sumXY/sumX
b=meanY-w*meanX
print('w=',w)
print('b=',b)
#第三步:预测房价
##输入商品房面积
x_test=[128.15,45.00,141.23,106.27,99.00,53.84,85.36,70.00]
print("面积\t估计房价")
for i in range(len(x_test)):
print(x_test[i],"\t",w*x_test[i]+b)
结果:
w= 0.8945605120044221
b= 5.410840339418002
面积 估计房价
128.15 120.0487699527847
45.0 45.66606337961699
141.23 131.74962144980253
106.27 100.47578595012793
99.0 93.97233102785579
53.84 53.57397830573609
85.36 81.77052564411547
70.0 68.03007617972756
方法二:numpy数组实现(速度快)
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 10 10:58:50 2020
一元线性回归--房价预测--numpy数组实现
@author: 16577
"""
import numpy as np
#第一步:加载样本数据
##x代表商品房面积
x=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,
46.91,68.00,63.02,81.26,86.21])
##y代表房价
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,69.65,75.69,95.30])
#第二步:根据学习模型--计算w,b
meanX=np.mean(x)
meanY=np.mean(y)
sumXY=np.sum((x-meanX)*(y-meanY))
sumX=np.sum((x-meanX)*(x-meanX))
w=sumXY/sumX
b=meanY-w*meanX
print('w=',w)
print('b=',b)
#第三步:预测房价
##输入商品房面积
x_test=np.array([128.15,45.00,141.23,106.27,99.00,53.84,85.36,70.00])
y_pred=w*x_test+b
print("面积\t估计房价")
for i in range(y_pred.size):
print(x_test[i],"\t",np.round(y_pred[i],2))#四舍五入,保留2位小数
结果如下:
w= 0.894560512004422
b= 5.410840339418002
面积 估计房价
128.15 120.05
45.0 45.67
141.23 131.75
106.27 100.48
99.0 93.97
53.84 53.57
85.36 81.77
70.0 68.03
两种方法其实差别主要在于numpy有专门的函数计算均值和其他运算,而numpy数组的运算效率更高。
方法三:tensorflow实现
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 10 11:43:56 2020
一元线性回归--房价预测--tensorflow实现
@author: 16577
"""
import tensorflow as tf
#第一步:加载样本数据
##x代表商品房面积
x=tf.constant([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,
46.91,68.00,63.02,81.26,86.21])
##y代表房价
y=tf.constant([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,69.65,75.69,95.30])
#第二步:根据学习模型--计算w,b
meanX=tf.reduce_mean(x)
meanY=tf.reduce_mean(y)
sumXY=tf.reduce_sum((x-meanX)*(y-meanY))
sumX=tf.reduce_sum((x-meanX)*(x-meanX))
w=sumXY/sumX
b=meanY-w*meanX
print('w=',w.numpy())
print('b=',b.numpy())
#第三步:预测房价
##输入商品房面积
x_test=tf.constant([128.15,45.00,141.23,106.27,99.00,53.84,85.36,70.00])
y_pred=w*x_test+b
print("面积\t估计房价")
for i in range(len(x_test)):
print(tf.constant(x_test[i]),"\t",tf.round(y_pred[i],2))
与numpy一样,tensorflow也有专门的函数用于运算,效率也更高。
结果如下:(结果未经提取)
w= 0.8945604
b= 5.4108505
面积 估计房价
tf.Tensor(128.15, shape=(), dtype=float32) tf.Tensor(120.0, shape=(), dtype=float32)
tf.Tensor(45.0, shape=(), dtype=float32) tf.Tensor(46.0, shape=(), dtype=float32)
tf.Tensor(141.23, shape=(), dtype=float32) tf.Tensor(132.0, shape=(), dtype=float32)
tf.Tensor(106.27, shape=(), dtype=float32) tf.Tensor(100.0, shape=(), dtype=float32)
tf.Tensor(99.0, shape=(), dtype=float32) tf.Tensor(94.0, shape=(), dtype=float32)
tf.Tensor(53.84, shape=(), dtype=float32) tf.Tensor(54.0, shape=(), dtype=float32)
tf.Tensor(85.36, shape=(), dtype=float32) tf.Tensor(82.0, shape=(), dtype=float32)
tf.Tensor(70.0, shape=(), dtype=float32) tf.Tensor(68.0, shape=(), dtype=float32)