线性回归模型-预测房价

影响房价最大的因素就是房屋的面积和地段,本文章中针对房屋的面积作为主要影响因素,分析房屋面积对房价的影响

1.神经元模型
根据生物神经元的模型抽象出如图(1.1)所示的数学结构:神经元的输入向量x=[x1,x2,x3,……,xn]Tx=[x1,x2,x3,……,xn ]^Tx=[x1,x2,x3,……,xn]T,经过函数映射:f:x→yf:x→yf:x→y
,展开为标量形式:f(x)=w1x1+w2x2+⋯+bf(x)=w1 x1+w2 x2+⋯+bf(x)=w1x1+w2x2+⋯+b,考虑到本文中对房价的影响因子,因为只讨论房屋的面积,所以构造的神经元模型标量表达式为:f(x)=w1×x1+bf(x)=w_1\times x_1 + bf(x)=w1​×x1​+b

参数θ=w1,w2,…,wn,bθ={ w_1,w_2,…,w_n,b }θ=w1​,w2​,…,wn​,b确定了神经元的形态,通过固定的θ参数即可确定此神经元的处理逻辑。(注:这里的www在《深度学习理论与应用》中叫做权重,是数组的形式;b称为偏置。有兴趣的小伙伴可以看看这本书)
通过上面的描述,我们建立预测模型,根据自变量与因变量,建立一元线性回归方程:y=wx+b+εy=wx+b+εy=wx+b+ε(y表示每平米的房价,x表示面积,w,b为上文介绍的回归系数,ε作为观测误差:εN(μ,σ2)ε~N(μ,σ^2)ε N(μ,σ2)均值为μ,方差为σ的二次方的正态分布,在实际的模型中εεε没有考虑进去)

2.损失函数
由于观测误差的存在,我们希望找到一组最贴合的直线去拟合若干的数据的点。我们使用均方误差作为损失函数。当我们拟合一条直线直线时,为了获得最拟合的直线,拟合直线的值与所有的数据做差,为了更好地表示,使用差平方的形式。故选择均方误差函数,表达式为:

然后我们需要搜索一组最优的参数w∗,b∗w^*, b^*w∗,b∗使得损失函数的值最小;而寻找最优的w(权重)和b(偏置),就要用到我们接下来要说的梯度下降法。

3.梯度下降法
梯度下降法在机器学习中应用十分广泛,它的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小值。梯度下降法可以用一个形象的例子来解释:假设一个人被困在山上,他需要从山上下来(找到山谷的最低点),但此时山上的浓雾很大,导致视线很低,因此下山的路径无法确定,必须利用自己周围的信息一步一步的找到下山的路径。这个时候,便可利用梯度下降法来帮助自己下山。怎么做呢?首先以她当前的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前的位置为基准,在寻找最陡峭的地方,再走一步,依次循环下去,直到走到山谷最低处。当应用到函数中,就是找到最优解(最优解也就是我们要求得的一元线性关系的权值和偏置项),梯度下降法又实现在模型的反向传播中。因为梯度的方向就是函数变化最快的方向。之前我们介绍均方误差作为损失函数的时候,我们希望损失函数达到最小,损失函数最小,也就是误差达到最小。此时我们就应用梯度下降法对均方误差求梯度。需要对(w∗,b∗)(w^*, b^*)(w∗,b∗)不断地迭代更新,直到找到使均方误差最小。
数学理解为:函数的梯度是对各个自变量的偏导数组成的向量。函数对自变量x的偏导数记为∂z/∂x∂z/∂x∂z/∂x,函数对y的偏导数记为∂z/∂y,则梯度∇f为向量(∂z/∂x,∂z/∂y)。
函数在各处的梯度方向∇f总是指向函数值增大的方向。这里要最小化的是均方差误差函数L:也就是对这个方程式对w求偏导数,在对b求偏导数。这里迭代更新w′w'w′和b′b'b′的式子如下:
解释说明:(1)α在梯度下降法中称为学习率或者步长,意味着我们可以通过α来控制下山每一步走的距离,以保证不要步子跨的太大,错过最低点,同时也保证不要走得太慢,迟迟走不到最低点。
(2)梯度前加负号,就意味着朝梯度相反的方向走。梯度其实是函数在此点上升最快的方向。而我们需要朝着下降最快的方向走,所以添加负号。
在这里通过查阅资料直接给出∂L/∂w,∂L/∂b和的结果:

算法实现

# 计算赤峰面积和房价之间的关系import numpy as np
import matplotlib.pyplot as plt# 构建数据集
data = []
# (70-90,90-100,100-110,110-130)
for i in range(300):# 面积(训练集)area = np.random.uniform(60,100)  # 房价eps2 = np.random.uniform(60,62)# biaseps3 = np.random.uniform(200., 700.)# 总房价(标签)price = eps2 * area + eps3  # 随机生成一个线性方程,大小为(500,1)data.append([area, price])
data=np.array(data)  # 数据集创建完毕 2维数组 [面积,房价]# 将参数分出来方便之后的使用
area = data[:,0]
price = data[:,1]
# 绘制原始数据
plt.title("Area-Price")  # 标题名
plt.scatter(area, price,s=10)  # 设置为散点图
plt.xlabel("area")  # x轴的标题
plt.ylabel("price")  # y轴的标题
plt.show()#绘制出来# 创建一个loss值的list
loss_list = []def mse(b, w, data):  # 根据当前的 w,b,参数计算均方差损失TotalError=0  # 记录总误差for i in range(0, len(data)):x = data[i, 0]y = data[i, 1]TotalError += (y - (w*x+b)) ** 2return TotalError / float(len(data))def gradient_update(b, w, data, lr):b_gradient = 0w_gradient = 0size = float(len(data))for i in range(0, len(data)):x = data[i, 0]y = data[i, 1]# 计算梯度b_gradient += (2 / size) * ((w * x + b) - y)w_gradient += (2 / size) * x * ((w * x + b) - y)# 根据梯度更新权重和偏置b -= lr * b_gradientw -= lr * w_gradientreturn [b,w]# 梯度下降法
def gradient_descent(data, b, w, lr, num_iterations):# 因为没有batch,所以num_iterations即为epochfor num in range(num_iterations):# 更新参数b,w = gradient_update(b, w, data, lr)# 计算损失值并添加到损失列表loss = mse(b, w, data)loss_list.append(loss)print('iteration:[%s] | loss:[%s] | w:[%s] | b:[%s]'%(num,loss,w,b))return [b,w]def main():lr = 0.00001initial_b = np.random.randn(1)initial_w = np.random.randn(1)num_iterations = 100  # 因为没有batch,所以num_iterations即为epoch[b,w] = gradient_descent(data,initial_b,initial_w,lr,num_iterations)loss = mse(b,w,data)print('Final loss:[%s] | w:[%s] | b:[%s]'%(loss,w,b))
#损失函数plt.title("Loss Function")  # 标题名plt.plot(np.arange(0,100), loss_list)plt.xlabel('Interation')plt.ylabel('Loss Value')plt.show()# 绘制y2 = w * area + bprint(w * 100 + b)plt.title("Fit the line graph")  # 标题名plt.scatter(area, price,label='Original Data',s=10)  # 设置为散点图plt.plot(area,y2,color='Red',label='Fitting Line',linewidth=2)plt.xlabel('m_j')plt.ylabel('j_g')plt.legend()plt.show()
main()

下面是实验结果,因为没有合适的真是的数据集,但是也是根据实际情况生成的数据集
原始数据集

损失函数曲线,迭代20次左右,损失值就接近0了。

拟合的数据图像,也是根据原始数据预测房价的线性模型

(到这里就结束了,这是前段时间老师布置的任务,是一篇小论文,所以有大量的文字,如果有不懂的小伙伴,我这里有很详细的ppt,可以分享给你们。代码中预测了100平米的房价,得出的数据与真实值很接近,另外房价是每平米的房价,不是总房价,这个要注意一下!还有就是这是一元的线性回归,也就是自变量(影响因素是单一的),所以只要是一元的线性回归问题,都基本差不多;其实二元的也就是迭代更新那多了几步,方法同样是一样的。 内容是复制我的论文,可能错误有点多。继续加油吖!)
———————————————————————————————————————————————————
———————————————————————————————————————————————————
下面是基于pytorch的二元线性回归房价预测,不同于上面的一元线性回归,该模型使用了pytorch框架,真正的回归模型,比较遗憾的是影响房价的因素面积和楼层高度都是初始化的随机变量,而真实房价的标签也是初始化的随机值,如果小伙伴有自己的数据,直接在该代码的第一步准备数据,导入自己的数据就可以,代码写的很详细,另外还想说的是代码中的数据类型变换都是我自己一个一个搜的函数,可能存在冗余,但是又缺一不可(学了深度学习以后,自己写的每个模型都喜欢分为两个,一个训练文件,一个测试文件:训练文件负责把输入数据(多元自变量)加载进回归模型,找到输入与输出的关系(就是权值文件),测试文件负责把最优的模型参数(权值文件)在送入网络模型,实现预测),想了解更多请看:pytorch实现随机数据和真实文件数据的线性回归模型

  • 1.训练文件
#计算赤峰面积和房价之间的关系
import torch as nn
import numpy as np
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
from torch.autograd import Variable
#—————————————————————————————————————————————————————————————————————————————————————————
#步骤一:准备数据
#—————————————————————————————————————————————————————————————————————————————————————————
#房价影响因素一(面积)【50-100平米之间产生300个随机数】
area = torch.linspace(50,100,300)
#房价影响因素二(楼层)【1层到30层之间产生300个随机数】
tall = torch.linspace(1,30,300)
#bias = torch.rand(area.size())
#如果有真实的数据对应,真实的标签就不会是随机值,损失也就会更小
y = torch.linspace(300000,500000,300)
#最终的价格
#price = 3500*area + 2000*tall
#price = 3500*area + 1000*tall + torch.rand(area.size())
#为了能够自动求导,需要将面积和价格变成variable格式
x = Variable(area)
y = Variable(y)
input = []
input.append(area)
input.append(tall)
#input.append(bias)
input= torch.tensor([item.detach().numpy() for item in input])
#-->input为10行2列的tensor
#-->input为10行3列的tensor
input = input.t()
X = torch.from_numpy(np.array(input)).type(torch.FloatTensor)
#--> 行tensor变列tensor
Y = y.view(300,-1)
Y = torch.from_numpy(np.array(Y)).type(torch.FloatTensor)
#print("Y:",Y.shape)
#print(Y)
#—————————————————————————————————————————————————————————————————————————————————————————
#步骤二:构建模型
#—————————————————————————————————————————————————————————————————————————————————————————
#定义一个线性回归模型(单输入单输出、单输入多输出、多输入多输出)
#model = nn.Linear(2,1)
model=nn.Sequential(nn.Linear(2, 6),nn.ReLU(),nn.Linear(6, 12),nn.ReLU(),nn.Linear(12, 1)
)
#—————————————————————————————————————————————————————————————————————————————————————————
#步骤三:损失函数和优化器
#—————————————————————————————————————————————————————————————————————————————————————————
#LOSS = nn.BCELoss()
LOSS = nn.L1Loss()
#optimizer=torch.optim.Adam(model.parameters(),lr=0.01)
#optimizer = torch.optim.SGD(model.parameters(),lr = 1e-3,momentum=0.8)
Cosine_lr = True
optimizer = torch.optim.Adam(model.parameters(), lr=0.1, weight_decay=5e-4)
#学习率余弦退火衰减法——用在模型中表现很优秀
if Cosine_lr:lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=5, eta_min=1e-5)
else:lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=1, gamma=0.92)
#—————————————————————————————————————————————————————————————————————————————————————————
#步骤四:训练模型
#—————————————————————————————————————————————————————————————————————————————————————————
PATH = '.\\house-predict.pth'
num_epochs = 500
best_loss = 0
iter_loss = []
for epoch in range(num_epochs):#前向传播predict = model(X)#print("predict:",predict.shape)#计算损失loss = LOSS(predict,Y)# 目的是保存最优的参数if best_loss == 0:best_loss = lossif loss < best_loss and epoch > 100:best_loss = lossbest_iter = epochtorch.save(model.state_dict(), PATH)print('保存模型')if (epoch % 20 == 0):print("-----------------------------------------------------------")print("第{}次迭代的loss是:{}".format(epoch, loss))iter_loss.append(loss.item())#优化损失函数#梯度清零optimizer.zero_grad()#误差反向传播loss.backward()#根据误差,优化函数optimizer.step()
print(f'{best_iter}:best loss:{best_loss}')
  • 2.房价预测文件
    ~ ~ ~
    因为我的输入数据是随机的,真实的targettargettarget标签也是随机的,所以训练下来损失依旧很大。所以在模型训练的时候,写入了保存最小损失的函数,也就是把最小损失的模型参数保存下来,这样测试的时候,加载的就是最优的参数。(model模型的架构不限于三层,自己可以随意尝试变换,一层,多层都可以,但最终的效果还是看层数和损失的变化),网盘链接包含处理真实文件数据,模型怎么导入数据的多元回归模型,以及随机生成数据的多元回归模型。
    训练预测文件,以及处理的文本数据可自行下载:
    链接:https://pan.baidu.com/s/1NZ5wKcRQ-b720cbNfKx0rw
    提取码:enzz

预测房价--基于python的线性回归模型相关推荐

  1. 基于Python多元线性回归模型

    提示:基于Python的多元线性回归模型 文章目录 前言 一.读取数据 二.建立模型 三.预测新值 四.去截距模型 总结 前言 本文主要是基于多元回归线性模型,然后建立模型和分析,解决多元线性回归模型 ...

  2. 机器学习之支持向量回归(SVR)预测房价—基于python

    大家好,我是带我去滑雪! 本期使用爬取到的有关房价数据集data.csv,使用支持向量回归(SVR)方法预测房价.该数据集中"y1"为响应变量,为房屋总价,而x1-x9为特征变量, ...

  3. Python建立线性回归模型进行房价预测

    Python建立线性回归模型进行房价预测 前期准备 多因子房价预测 实战流程 1.数据加载 2.数据可视化 3.数据预处理 4.模型建立与训练 5.模型预测 6.模型评估 7.房价预测 数据与代码 前 ...

  4. 基于Python的线性回归预测模型介绍及实践

    基于Python的线性回归预测模型介绍及实践 这是一篇学习的总结笔记 参考自<从零开始学数据分析与挖掘> [中]刘顺祥 著 完整代码及实践所用数据集等资料放置于:Github 线性回归预测 ...

  5. python怎么掉包_Python实战教程:拒绝调包,如何用python推导线性回归模型

    原标题:Python实战教程:拒绝调包,如何用python推导线性回归模型 最近有人问我一个问题,我数学不好,代码基础薄弱,英语一般般,如何入门当今最为前沿的机器学习领域?均方差损失,MSE,平方损失 ...

  6. 【电力预测】基于matlab GUI灰色模型电力负荷预测【含Matlab源码 769期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab GUI灰色模型电力负荷预测[含Matlab源码 769期] 获取代码方式2: 通过订阅紫极神光博客付费专 ...

  7. python多元线性回归模型案例_Python 实战多元线性回归模型,附带原理+代码

    原标题:Python 实战多元线性回归模型,附带原理+代码 作者 | 萝卜 来源 | 早起Python( ID:zaoqi-python ) 「多元线性回归模型」非常常见,是大多数人入门机器学习的第一 ...

  8. python 线性回归 技术方案亮点_基于Python的线性回归实战

    一.线性回归的理论 1)线性回归的基本概念 线性回归是一种有监督的学习算法,它介绍的自变量的和因变量的之间的线性的相关关系,分为一元线性回归和多元的线性回归.一元线性回归是一个自变量和一个因变量间的回 ...

  9. 基于Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用培训班

    一 Python入门基础 [理论讲解与案例演示实操练习] 1.Python环境搭建( 下载.安装与版本选择). 2.如何选择Python编辑器?(IDLE.Notepad++.PyCharm.Jupy ...

最新文章

  1. 2022-2028年中国汽车修理行业市场前瞻与投资规划分析报告
  2. 《代码整洁之道:程序员的职业素养》一一1.5 参考文献
  3. sklearn模型的训练(下)
  4. C语言中static用法大全
  5. 超详细 - SVN下载安装及使用教程
  6. windows server 2003优化设置方法
  7. Centos7 防火墙 ( firewalld ) 和 Selinux 一些简单操作命令
  8. 0x7c97cd12 指令引用的 0x00000014内存。该内存不能为written
  9. JavaScript篇 深入理解JavaScript函数
  10. php获取当前文件夹下所有图片大小,PHP获取文件夹大小函数用法实例
  11. Mean filter 和 Gaussian filter对比
  12. 校园卡系统mysql与java结合_基于Java+JSP+Mysq+Servletl的校园卡一卡通管理系统
  13. 微信小程序内容组件图标 icon
  14. 重磅来袭!这几款手机软件绝对的深入人心!
  15. 如何解决win10连接手机无反应情况
  16. 烤地瓜(PYTHON 学习类和对象)
  17. FPGA试题练习--------CMOS门电路分析
  18. html广告sdk,腾讯社交联盟广告
  19. 读书笔记-流畅的python(1-6章)
  20. 将中文括号变为英文括号

热门文章

  1. 情理之中 - Macs do Windows
  2. 推荐系统模型论文阅读笔记
  3. 《新建文本文档》贾瑜
  4. MAC Matlab 中文乱码
  5. 下列叙述中正确的是 java语言_1. 下列关于JAVA语言特点的叙述中,错误的是[   ] A、Java是面向过程的编程语言...
  6. R语言-ggplot基础绘图参数设置
  7. unity android x86,Unity3d面向英特尔 x86 平台的 Unity* 优化指南: 第 4 部分
  8. 脱壳_01_虚拟机壳_VMP
  9. Chocolatey安装与常用命令
  10. python break怎么跳出两层循环(多层循环)?添加标志量