一元线性回归实现房价预测---python,numpy,tensorflow三种方法实现

以下是看了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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值