【机器学习】梯度下降预测波士顿房价

文章目录

  • 前言
  • 一、数据集介绍
  • 二、预测房价代码
    • 1.引入库
    • 2.数据
    • 3.梯度下降
  • 总结


前言

梯度下降算法学习。

一、数据集介绍

波士顿房价数据集:波士顿房价数据集,用于线性回归预测

二、预测房价代码

1.引入库

from sklearn.linear_model import LinearRegression as LR
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston as boston 
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
import numpy as np
from sklearn.metrics import mean_squared_error

2.数据

def preprocess():
    # get the dataset of boston
    X = boston().data
    y = boston().target
    name_data = boston().feature_names
 
    # draw the figure of relationship between feature and price
    plt.figure(figsize=(20,20))
    for i in range(len(X[0])):
        
        plt.subplot(5, 3, i + 1)
        plt.scatter(X[:, i], y, s=20)
        plt.title(name_data[i])
    plt.show()
    # 删除相关性较低的特征
    # X = np.delete(X, [0, 1, 3, 4, 6, 7, 8, 9, 11], axis=1)
 
    # normalization
    for i in range(len(X[0])):
        X[:, i] = (X[:, i] - X[:, i].min()) / (X[:, i].max() - X[:, i].min())
 
    # split into test and train
    Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.3, random_state=10)
    
    return Xtrain, Xtest, Ytrain, Ytest, X
def lr(Xtrain, Xtest, Ytrain, Ytest, if_figure):
    # use LinearRegression
    reg = LR().fit(Xtrain, Ytrain)
    y_pred = reg.predict(Xtest)
    loss = mean_squared_error(Ytest, y_pred)
 
    print("*************LR*****************")
    print("w\t= {}".format(reg.coef_))
    print("b\t= {:.4f}".format(reg.intercept_))
 
    # draw the figure of predict results
    if if_figure:
        plt.figure(figsize = (14,6),dpi = 80)
        plt.plot(range(len(Ytest)), Ytest, c="blue", label="real")
        plt.plot(range(len(y_pred)), y_pred, c="red", linestyle=':', label="predict")
        plt.title("predict results from row LR")
        plt.legend()
        plt.show()
 
    return loss

3.梯度下降

def gradDescnet(Xtrain, Xtest, Ytrain, Ytest, X, if_figure, rate):
    # 梯度下降
    def grad(y, yp, X):
        grad_w = (y - yp) * (-X)
        grad_b = (y - yp) * (-1)
        return [grad_w, grad_b]
 
    # 设置训练参数
    epoch_train = 100
    learning_rate = rate
    w = np.random.normal(0.0, 1.0, (1, len(X[0])))
    b = 0.0   
    loss_train = []
    loss_test = []
    for epoch in range(epoch_train + 1):
        loss1 = 0
        for i in range(len(Xtrain)):
            yp = w.dot(Xtrain[i]) + b
            # 计算损失
            err = Ytrain[i] - yp
            loss1 += err ** 2
            # 迭代更新 w 和 b
            gw = grad(Ytrain[i], yp, Xtrain[i])[0]
            gb = grad(Ytrain[i], yp, Xtrain[i])[1]
            w = w - learning_rate * gw
            b = b - learning_rate * gb
        # 记录损失
        loss_train.append(loss1 / len(Xtrain))
 
        loss11 = 0
        for i in range(len(Xtest)):
            yp2 = w.dot(Xtest[i]) + b
            err2 = Ytest[i] - yp2
            loss11 += err2 ** 2
        # 记录损失
        loss_test.append(loss11 / len(Xtest))
 
        # shuffle the data
        Xtrain, Ytrain = shuffle(Xtrain, Ytrain)
 
    # draw the figure of loss
    if if_figure:
        plt.figure()
        plt.title("figure of loss")
        plt.plot(range(len(loss_train)), loss_train, c="blue", linestyle=":", label="train")
        plt.plot(range(len(loss_test)), loss_test, c="red", label="test")
        plt.legend()
        plt.show()
    # draw figure of predict results
    if if_figure:
        Predict_value = []
        for i in range(len(Xtest)):
            Predict_value.append(w.dot(Xtest[i]) + b)
        plt.figure()
        plt.title("predict results from gradScent")
        plt.plot(range(len(Xtest)), Ytest, c="blue", label="real")
        plt.plot(range(len(Xtest)), Predict_value, c="red", linestyle=':', label="predict")
        plt.legend()
        plt.show()
 
    return loss_test[-1], w, b
def test():
    if_figure = True
    Xtrain, Xtest, Ytrain, Ytest, X = preprocess()
    loss_lr = lr(Xtrain, Xtest, Ytrain, Ytest, if_figure)
    loss_gd, w, b = gradDescnet(Xtrain, Xtest, Ytrain, Ytest, X, if_figure, 0.01)
    print("*************GD*****************")      
    print("w\t: {}".format(w))
    print("b\t: {}".format(b))
    print("************loss****************")
    print("lr\t: %.4f" % loss_lr)
    print("gd\t: %.4f" % loss_gd)
def searchRate():
    if_figure = False
    Xtrain, Xtest, Ytrain, Ytest, X = preprocess()
 
    loss_grad = []
    w_grad = []
    b_grad = []
    rates = list(np.arange(0.001, 0.05, 0.001))
    epoch = 1
    for rate in rates:
        loss, w, b = gradDescnet(Xtrain, Xtest, Ytrain, Ytest, X, if_figure, rate)
        loss_grad.append(loss[0])
        w_grad.append(w)
        b_grad.append(b)
        print("epoch %d: %.4f" % (epoch, loss_grad[-1]))
        epoch += 1
 
    plt.figure()
    plt.plot(rates, loss_grad)
    plt.title("loss under different rate")
    plt.show()
    loss_grad_min = min(loss_grad)
    position = loss_grad.index(loss_grad_min)
    w = w_grad[position]
    b = b_grad[position]
    rate = rates[position]
    loss_lr = lr(Xtrain, Xtest, Ytrain, Ytest, if_figure)
    print("*************GD*****************")
    print("w\t: {}".format(w))
    print("b\t: {}".format(b))
    print("rate: %.3f" % rate)
    print("************loss****************")
    print("lr\t: %.4f" % loss_lr)
    print("gd\t: %.4f" % loss_grad_min)

data = boston
Xtrain, Xtest, Ytrain, Ytest, X = preprocess()

在这里插入图片描述

lr(Xtrain, Xtest, Ytrain, Ytest,True)

在这里插入图片描述

test()

在这里插入图片描述在这里插入图片描述

searchRate()

在这里插入图片描述
在这里插入图片描述

总结

通过此次学习,对梯度下降算法有了更深的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/120516.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】设置容器系统字符集zh_CN.UTF-8退出失效:关于Docker容器配置环境变量,再次进入失效问题

设置容器系统字符集zh_CN.UTF-8退出失效:关于Docker容器配置环境变量,再次进入失效问题 修改正在运行的Docker容器内的字符集: 先进入Docker容器:docker exec -it 容器ID /bin/bash查看是否支持中文字符集:locale -a | grep zh&a…

案例 | 3D可视化工具HOOPS助力SolidWorks edrawings成功引入AR/VR技术

HOOPS中文网慧都科技是HOOPS全套产品中国地区指定授权经销商,提供3D软件开发工具HOOPS售卖、试用、中文试用指导服务、中文技术支持。http://techsoft3d.evget.com/达索系统SolidWorks面临的挑战 达索系统SolidWorks公司开发和销售三维CAD设计软件、分析软件和产品…

五、计算机网络

(一)OSI/RM 七层模型 七层模型是计算机网络的基石,整个计算机网络是构建与七层模型之上的。 在数据链路层,数据开始以帧为单位,网卡的 MAC 地址就是数据帧的地址,数据的传输开始有地址了。 局域网是工作…

国自然中标越来越难,怎样才能赢在起跑线上?

众所周知,国自然在学术界的地位和影响力不容小觑。“国自然在手,天下我有”,对于科研人来说,成功申报国自然,有助于职称评审、职业升迁,同时,获得不菲的科研经费。据了解,有些高校还…

https网站加载http资源问题

https网站加载http资源问题 前言:最近项目对接了一个第三方的平台、我们需要展示第三方平台返回来的图片资源、由于我们的服务器设置为了https、但是第三方平台返回的图片链接是 http 资源。所以就出现了图片无法加载出来的问题,在此记录一下问题的解决…

ps人像怎么做渐隐的效果?

photoshop怎么制作人像渐隐的图片效果?渐隐效果需要使用渐变来实现,下面我们就来看看详细的教程。 首先,我们打开Photoshop,点击屏幕框选的【打开】,打开一张背景图片。 下面,我们点击左上角【文件】——【…

如何在Jetpack Compose中显示PDF?

当读取和显示 PDF 的组件缺失时该怎么办? 声明式编程可以拯救你. Jetpack Compose已经存在好几年了, 但_在某些方面它的使用仍然面临挑战_. 例如, 缺少用于查看PDF的官方组件, 而为数不多的第三方库通常也是有代价的. 在我们的应用中, 我们会遇到在许多场景中显示 PDF 的需求…

1.1 HTML4

一. 前言 1. 两位先驱 艾伦麦席森图灵 二战时期,破译了德军的战争编码一英格玛。让二战提前2年结束,拯救了上千万人的生命。设立图灵奖,被后人誉为:人工智能之父。 约翰冯诺依曼 制订了现代计算机标准一一冯诺依曼体系结构。提出:计算机要…

目标检测中的评价指标

目标检测中的评价指标 将检测目标分为正样本和负样本。 真阳性(true positives , TP) : 正样本被正确识别为正样本。 假阳性(false positives, FP): 负样本被错误识别为正样本。 假阴性(false negatives, FN&#…

微服务项目,请求从发出到后端处理器的历程

点击登录按钮,发出 http://localhost:8803/service_6001/admin/login/in请求,这是一个由nginx配置的前端项目 查看配置文件,该条请求会被映射形成对http://localhost:51603/admin/login/in的post请求 upstream heima-admin-gateway {server localhost:51603; } server {liste…

Spring Cloud之多级缓存

目录 传统缓存 多级缓存 JVM进程缓存 Caffeine 缓存驱逐策略 实现进程缓存 常用Lua语法 数据类型 变量声明 循环使用 定义函数 条件控制 安装OpenResty 实现Nginx业务逻辑编写 请求参数解析 实现lua访问tomcat JSON的序列化和反序列化 Tomcat的集群负载均衡 …

20231106-前端学习加载和视频球特效

加载效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>加载效果</title><!-- 最新…

HarmonyOS应用开发-ArkTS基础知识

作者&#xff1a;杨亮Jerry 作为多年的大前端程序开发工作者&#xff0c;就目前的形式&#xff0c;个人浅见&#xff0c;在未来3-5年&#xff0c;移动端依旧是Android系统和iOS系统的天下。不过基于鸿蒙系统的应用开发还是值得我们去花点时间去了解下的&#xff0c;阅读并实践官…

公共数据这座金矿,授权运营为何是赋能的关键路径?

数据要素市场化正开启下一个关键阶段。 自2014年大数据写入政府工作报告&#xff0c;到全国各地大数据交易所涌现&#xff0c;再到《数据二十条》颁布&#xff0c;中国数据要素产业探索之路已走过近十载。如今&#xff0c;国家大数据局正式成立&#xff0c;更是标志着数据要素…

2023数学建模国赛C题赛后总结

今天国赛的成绩终于出来了&#xff0c;盼星星盼月亮的。之前面试的时候已经把我给推到国奖评委那里去了&#xff0c;可是好可惜&#xff0c;最终以很微小的劣势错失国二。只拿到了广西区的省一。我心里还是很遗憾的&#xff0c;我真的为此准备了很久&#xff0c;虽然当中也有着…

vue3+setup 解决:this.$refs引用子组件报错 is not a function

一、如果在父组件中以下四步都没问题的话&#xff0c;再看下面步骤 二、如果父组件引用的是index页面 请在 头部加上以下代码 &#xff08;如果是form页面请忽略这一步&#xff09; <template> <a-modalv-model:visible"visible"title"头部名称&…

Dockerfile

文章目录 基本概念commit构建镜像常用指令拓展指令ARGUSERONBUILDHEALTHCHECK SpringBoot项目镜像构建Nginx项目镜像构建 基本概念 Docker为我们提供一个用于自定义构建镜像的一个配置文件。利用docker的build命令&#xff0c;指定dockerfile文件&#xff0c;就能按配置内容把…

数据仓库工具箱-零售业务

文章目录 一、维度模型设计的4步过程1.1 第一步&#xff1a;选择业务过程1.2 第二步&#xff1a;声明粒度1.3 第三步&#xff1a;确定维度1.4 第四步&#xff1a;确定事实 二、零售业务案例研究2.1 第一步&#xff1a;选择业务过程2.2 第二步&#xff1a;声明粒度2.3 第三步&am…

,多数据源+Mybatisplus + Sharding JDBC同一库中分表

水平分表是在同一个数据库内&#xff0c;把同一个表的数据按一定规则拆到多个表中,多数据源采用 mybatis-plus的dynamic-datasource 分库分表采用sharding-jdbc 数据库连接池管理是alibaba的druid-spring-boot-starter 同一个数据库内分表 目录 1.数据库表 2.配置 3.引入的…

企业计算机服务器中了360勒索病毒怎么办?勒索病毒解密,数据恢复

网络技术的不断发展给企业的生产与生活提供了极大的帮助&#xff0c;但随之而来的网络安全威胁也不断增加&#xff0c;近期&#xff0c;云天数据恢复中心的工程师接到了很多企业的求助&#xff0c;企业的计算机服务器数据库遭到了360后缀勒索病毒&#xff0c;通过对该病毒的检测…
最新文章