机器学习实战:银行客户是否认购定期存款
项目结构与步骤
1. 项目概述
- 项目名称:葡萄牙银行电话营销活动分析与定期存款认购预测
- 目标:通过分析银行的电话营销数据,构建模型预测客户是否会认购定期存款。
- 数据来源:葡萄牙银行营销活动数据集
- 关键挑战:数据不平衡,数据中认购定期存款的客户较少。
2. 问题定义
- 业务问题:提高银行电话营销活动的成功率,优化客户名单,减少不必要的联系,提高存款认购率。
- 任务:分类问题,预测目标变量
y
(客户是否认购定期存款)。
3. 变量说明与分析
# 数据来源于国外的数据库
分析过程
1、导数数据,看一下并一下数据的相关信息,检测有没有缺失值。
import pandas as pd
data0 = pd.read_csv("bank.csv")
# 数据分析前最好拷贝一份数据
data = data.copy()
print(data.info())
就结果来看,一个4521条数据,16个特征变量,一个目标变量y,每一特征列都没有缺失值。数据量不算很大(<1w条,小规模数据集),如果对精度有要求,可以直接用CatBoost模型,但是训练速度较慢。
2、我们输出最后10行看看数据大概长什么样。
3、发现类别特征为英文文本(比如job),二分类特征(比如default)也为英文文本("Yes" or "No"),因此我们要对这些变量进行编码,转换成计算机能处理的数值型变量。
# 将部分二元分类特征转换为数值(yes -> 1, no -> 0)
binary_columns = ['default', 'housing', 'loan', 'y']
for col in binary_columns:data[col] = data[col].map({"yes": 1, "no": 0})# 对类别特征进行独热编码
data = pd.get_dummies(data, columns=['job', 'marital', 'education', 'contact', 'poutcome'], drop_first=True)# 将月份映射为数值
month_mapping = {"jan": 1, "feb": 2, "mar": 3, "apr": 4, "may": 5, "jun": 6, "jul": 7,"aug": 8, "sep": 9, "oct": 10, "nov": 11, "dec": 12
}
data['month'] = data['month'].map(month_mapping)# 分离特征和目标变量
X = data.drop("y", axis=1)
y = data['y']
4、由于数据集目标变量y类别不平衡,会影响模型效果,我们先处理类别不平衡,这里我们使用欠采样(减少多数类数据)来处理。
from imblearn.under_sampling import RandomUnderSampler# 处理类别不平衡问题(欠采样)
rus = RandomUnderSampler(random_state=40)
X, y = rus.fit_resample(X, y)# 检查一下是否平衡
print(y.value_counts())
# 输出后10条数据,检查一下类别变量是否都成功编码
print(X.tail(10))
类别平衡了,编码也没问题。
5、这里我们用普通决策树分类器、随机森林、GBDT、CatBoost练练手。
我们先使用决策树分类器(CART算法)训练模型,并利用网格搜索 + 交叉验证来优化超参数。根据我们的任务需求,我们模型预测准确度要尽可能高,因此我们用准确的来评估模型。
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score
import time# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y)# 决策树分类器 + 超参数网格搜索
dt = DecisionTreeClassifier(random_state=40)param_grid = {'criterion': ['gini', 'entropy'], # 分裂标准'max_depth': [None, 9, 10, 11], # 树的最大深度'min_samples_split': [2, 4, 5, 7, 10], # 节点分裂的最小样本数'min_samples_leaf': [1, 2, 3, 4, 5, 10], # 叶节点的最小样本数
}# 开始计时
start_time = time.time()# 网格搜索 + 5折交叉验证
grid_search = GridSearchCV(estimator=dt, param_grid=param_grid, scoring='accuracy', cv=5, n_jobs=-1)
grid_search.fit(X_train, y_train)# 输出最佳参数和模型
best_params = grid_search.best_params_
best_model = grid_search.best_estimator_# 预测和评估
y_pred = best_model.predict(X_test)
end_time = time.time()# 打印结果
print("最佳参数:", best_params)
print("训练时间: {:.2f}秒".format(end_time - start_time))
print("测试集准确率:", accuracy_score(y_test, y_pred))
单颗决策树,得出最好的模型准确率80%,效果还可以,我们希望可以更高一些。
6、我们这次选用随机森林来预测。
import time
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)start_time = time.time()# 模型构建
rf = RandomForestClassifier(random_state=42)# 设置超参数搜索网格
param_grid = {'n_estimators': [34, 36, 38, 40, 42],'max_depth': [18, 20, 22, 24, 26],'min_samples_split': [8, 10, 12, 15, 18],'min_samples_leaf': [2, 3, 4, 5, 6],'bootstrap': [True, False]
}# 超参数调优
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, scoring='accuracy', cv=5, n_jobs=-1)
grid_search.fit(X_train, y_train)# 模型评估
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)
end_time = time.time()
training_time = end_time - start_time# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"训练时间: {training_time:.2f} 秒")
print("最优参数:", grid_search.best_params_)
print("测试集准确率:", accuracy)
随机森林模型准确率在85%左右,提高了很大,效果已经很好了。
8、不妨再试试GBDT模型。
import time
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)start_time = time.time()
# 定义 GBDT 模型
gbdt_model = GradientBoostingClassifier(random_state=42)# 设置超参数搜索网格
param_grid = {'n_estimators': [100, 200, 250], # 弱学习器(树)的数量'learning_rate': [0.01, 0.05, 0.1], # 学习率'max_depth': [3, 4, 5], # 每棵树的深度'min_samples_split': [5,10, 15], # 内部节点划分的最小样本数'min_samples_leaf': [1, 3, 5], # 叶节点的最小样本数
}# 使用 GridSearchCV 进行超参数调优
grid_search = GridSearchCV(estimator=gbdt_model, param_grid=param_grid, scoring='accuracy', cv=5, n_jobs=-1)
grid_search.fit(X_train, y_train)# 模型评估、预测
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
end_time = time.time() # 输出最优参数
print("最优参数:", grid_search.best_params_)
print("测试集准确率:", accuracy)
training_time = end_time - start_time
print(f"训练时间: {training_time:.2f} 秒")
效果跟随机森林差不多。
9、由于数据集中,类别特征较多,非常适合使用CatBoost模型。对于catboost而言,不用对类别进行独热编码,只要进行简单的标签编码即可。
import time
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from imblearn.under_sampling import RandomUnderSampler
from catboost import CatBoostClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, precision_score# 数据加载
data = pd.read_csv("bank.csv").copy()# 将部分二元分类特征转换为数值(yes -> 1, no -> 0)
binary_columns = ['default', 'housing', 'loan', 'y']
for col in binary_columns:data[col] = data[col].map({"yes": 1, "no": 0})# 使用 LabelEncoder 对类别特征进行标签编码
label_columns = ['job', 'marital', 'education', 'contact', 'poutcome', 'month']
label_encoders = {}for col in label_columns:le = LabelEncoder()data[col] = le.fit_transform(data[col])label_encoders[col] = le # 保存每个列的编码器(如果需要解码)# 分离特征和目标变量
X = data.drop("y", axis=1)
y = data['y']# 处理类别不平衡问题(欠采样)
rus = RandomUnderSampler(random_state=40)
X, y = rus.fit_resample(X, y)# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)# 定义 CatBoost 模型
start_time = time.time()
catboost_model = CatBoostClassifier(verbose=0, random_state=42)# 设置超参数搜索网格
# 这是我多次测试的数据,已经是经过压缩的,所以只有一个参数
param_grid = {'iterations': [285,290,295],'depth': [6],'learning_rate': [0.05],'l2_leaf_reg': [6]
}# 使用 GridSearchCV 进行超参数调优
grid_search = GridSearchCV(estimator=catboost_model, param_grid=param_grid, scoring='accuracy', cv=5, n_jobs=-1)
grid_search.fit(X_train, y_train)# 模型评估、预测
best_model = grid_search.best_estimator_
best_params = grid_search.best_params_
y_pred = best_model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
end_time = time.time()print("最佳参数:", best_params)
print("训练时间: {:.2f}秒".format(end_time - start_time))
print("测试集准确率:", accuracy_score(y_test, y_pred))
# 文章哪里可以改进的,或者哪里做的不好的,欢迎大家讨论分享,希望能指点我!
相关文章:
机器学习实战:银行客户是否认购定期存款
项目结构与步骤 1. 项目概述 项目名称:葡萄牙银行电话营销活动分析与定期存款认购预测目标:通过分析银行的电话营销数据,构建模型预测客户是否会认购定期存款。数据来源:葡萄牙银行营销活动数据集关键挑战:数据不平衡…...
【一篇搞定配置】网络分析工具WireShark的安装与入门使用
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀各种软件安装与配置_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1.…...
气膜场馆照明设计:科技与环保的完美结合—轻空间
气膜场馆的照明设计,选用高效节能的400瓦LED灯具,结合现代节能技术,提供强大而均匀的光照。LED灯具在光效和寿命方面优势显著,不仅降低运营能耗,还有效减少碳排放,为绿色场馆建设贡献力量。 科学分布&…...
C语言程序编译和链接
编译环境和运行 编译环境也可以称为翻译环境,是将源代码转换为机器可以识别的二进制指令; 运行环境也可以称为执行环境,用于实际执行代码; 翻译环境 翻译环境由编译和链接两个部分组成,而编译又可以分解为&#x…...
springBoot整合 Tess4J实现OCR识别文字(图片+PDF)
1. 环境准备 JDK 8 或更高版本Maven 3.6 或更高版本Spring Boot 2.4 或更高版本Tesseract OCR 引擎Tess4J 库 2. 安装 Tesseract OCR 引擎 下载地址: Home UB-Mannheim/tesseract Wiki GitHub linux直接安装:sudo apt-get install tesseract-ocr 3.…...
阿里数字人工作 Emote Portrait Alive (EMO):基于 Diffusion 直接生成视频的数字人方案
TL;DR 2024 年 ECCV 阿里智能计算研究所的数字人工作,基于 diffusion 方法来直接的从音频到视频合成数字人,避免了中间的三维模型或面部 landmark 的需求,效果很好。 Paper name EMO: Emote Portrait Alive - Generating Expressive Portra…...
Java将PDF保存为图片
将 PDF 文件转换为图片是常见的需求之一,特别是在需要将 PDF 内容以图像形式展示或处理时。其中最常用的是 Apache PDFBox。 使用 Apache PDFBox Apache PDFBox 是一个开源的 Java 库,可以用来处理 PDF 文档。它提供了将 PDF 页面转换为图像的功能。 …...
医药企业的终端市场营销策略
近年来,随着医药行业的快速发展,终端市场逐渐成为企业竞争的关键领域。在政策趋严、市场环境变化以及数字化转型的大背景下,医药企业如何在终端市场中立于不败之地?本文结合我们在医药数字化领域的经验,为大家剖析终端…...
使用EFK收集k8s日志
首先我们使用EFK收集Kubernetes集群中的日志,本次实验讲解的是在Kubernetes集群中启动一个Elasticsearch集群,如果企业内已经有了Elasticsearch集群,可以直接将日志输出至已有的Elasticsearch集群。 文章目录 部署elasticsearch创建Kibana创建…...
Vue3 + TypeScript 项目搭建
Vue3 TypeScript 项目搭建 环境准备 首先确保你的开发环境满足以下要求: # 检查 Node.js 版本 (需要 14.0 或更高版本) node -v# 检查 npm 版本 npm -v# 安装或更新 Vue CLI npm install -g vue/cli创建项目 使用 Vue CLI 创建项目: # 创建项目 np…...
Python操作neo4j库py2neo使用(一)
Python操作neo4j库py2neo使用(一) 安装(只用于测试) docker-compose .yml 文件 version: 3.8 services:neo4j:image: neo4j:5.6.0-enterprise #商业版镜像hostname: neo4jcontainer_name: neo4jports:- "7474:7474"-…...
(原创)Android Studio新老界面UI切换及老版本下载地址
前言 这两天下载了一个新版的Android Studio,发现整个界面都发生了很大改动: 新的界面的一些设置可参考一些博客: Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说,没有时间去适应,那么怎么办呢&am…...
Linux——用户级缓存区及模拟实现fopen、fweite、fclose
linux基础io重定向-CSDN博客 文章目录 目录 文章目录 什么是缓冲区 为什么要有缓冲区 二、编写自己的fopen、fwrite、fclose 1.引入函数 2、引入FILE 3.模拟封装 1、fopen 2、fwrite 3、fclose 4、fflush 总结 前言 用快递站讲述缓冲区 收件区(类比输…...
CKA认证 | Day2 K8s内部监控与日志
第三章 Kubernetes监控与日志 1、查看集群资源状态 在 Kubernetes 集群中,查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释,帮助你更好地管理和监控 Kubernetes 集群。 1.1 查看master组件状态 Kubernetes 的 Master 组件包…...
大模型部署,运维,测试所需掌握的知识点
python环境部署: python3 -m site --user-base 返回用户级别的Python安装基础目录 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 将python3的默认路径/usr/bin/python3替…...
JDBC编程---Java
目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源,并设置数据库所在的位置,三条固定写法 2.建立和数据库服务器之间的连接,连接好了后ÿ…...
什么是沙箱(Sandbox)技术
沙箱技术是一种重要的计算机安全机制,主要用于隔离程序运行环境,以防止恶意代码或应用程序对系统和数据造成破坏。通过限制代码的访问权限和行为,沙箱为程序提供了一个受控且隔离的执行环境。 核心特点 隔离性沙箱运行的程序被限制在一个受控…...
TCP socket api详解
文章目录 netstat -nltpaccept简单客户端工具 telnet 指定服务连接connect异常处理version 1 单进程版version 2 多进程版version 3 -- 多线程版本version 4 ---- 线程池版本 创建套接字socket sockaddr_in结构体 bind 之后就和UDP不一样了。 因为TCP是一个面向连接的服务器&…...
Linux——环境变量
环境变量一般指的是在操作系统重用来指定操作系统运行环境的一些参数,这些参数会被bash使用,而bash是被我们用户使用的,也就是说,这些环境变量间接的也是被我们用户使用的。环境变量通常都有某些特殊的用途,它在系统重…...
Windows Pycharm 远程 Spark 开发 PySpark
一、环境版本 环境版本PyCharm2024.1.2 (Professional Edition)Ubuntu Kylin16.04Hadoop3.3.5Hive3.1.3Spark2.4.0 二、Pycharm远程开发 文件-远程-开发 选择 SSH连接,连接虚拟机,选择项目目录即可远程开发...
【es6进阶】vue3中的数据劫持的最新实现方案的proxy的详解
vuejs中实现数据的劫持,v2中使用的是Object.defineProperty()来实现的,在大版本v3中彻底重写了这部分,使用了proxy这个数据代理的方式,来修复了v2中对数组和对象的劫持的遗留问题。 proxy是什么 Proxy 用于修改某些操作的默认行为࿰…...
【Isaac Sim】加载自带模型或示例时报 Isaac Sim is not responding
Isaac Sim对电脑配置要求很高,开机第一次打开 Isaac Sim 时,直接就报 Isaac Sim is not responding 卡死了,这是由于第一次需要加载一些资源,耗时会导致 Isaac Sim 无响应,这里等一会会自动给回复。 加载自带模型或示…...
React (三)
文章目录 项目地址十二、性能优化12.1 使用useMemo避免不必要的计算12.2 使用memo缓存组件,防止过度渲染12.3 useCallBack缓存函数12.4 useCallBack里访问之前的状态(没懂)十三、Styled-Components13.1 安装13.2给普通html元素添加样式13.3 继承和覆盖样式13.4 给react组件添…...
C0031.在Clion中使用mingw编译器来编译opencv的配置方法
mingw编译器编译opencv库的配置方法...
多目标跟踪算法
文章目录 一、传统方法1. 基于卡尔曼滤波器的方法1.1 Kalman Filter(卡尔曼滤波器) 2. 基于数据关联的方法2.1 匈牙利算法 二、深度学习方法1. 基于检测的多目标跟踪1.1 SORT算法1.2 DeepSort1.3 BoT-SORT 2. 基于特征关联和增强的方法2.1 ByteTrack 3. 基于Transformer的方法3…...
【CSS in Depth 2 精译_059】9.2 把 CSS 模块组合成更大的结构
当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 ✔️ 9.2.1 模块中多个职责的…...
uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题
uniappvue3ts H5端使用Quill富文本插件以及解决上传图片反显的问题 1.在项目中安装Quill npm i quill1.3.72.需要显示富文本的页面完整代码 <template><view><div ref"quillEditor" style"height: 65vh"></div></view> &…...
shell(二)
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
在使用PCA算法进行数据压缩降维时,如何确定最佳维度是一个关键问题?
一、PCA算法的基本原理 PCA算法的核心思想是通过正交变换,将一组可能相关的变量转换成一组线性不相关的变量,称为主成分。这组主成分能够以最小的信息损失来尽可能多地保留原始数据集的变异性。具体来说,PCA算法包括以下几个步骤:…...
学习嵩山版《Java 开发手册》:编程规约 - 命名风格(P1 ~ P2)
概述 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,他旨在提升开发效率和代码质量 《Java 开发手册》是一本极具价值的 Java 开发规范指南,对于提升开发者的综合素质和代码质量具有重要意义 学习《Java 开发手册》是一个提升 Jav…...
#渗透测试#红蓝攻防#HW#SRC漏洞挖掘01之静态页面渗透
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
开源POC库推荐
声明 学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结ResNeXt基本介绍 1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数:定义损失函数&…...
用vite下载的react + TS的项目,组件会调用两次
解决方案: 去掉main.tsx文件中的StrictMode...
STM32F4----DCA数字量转换成模拟量
STM32F4----DCA数字量转换成模拟量 基本原理 上一节讲诉了ADC的具体原理与程序搭建https://blog.csdn.net/qq_35970934/article/details/143999874?spm1001.2014.3001.5501。这节讲DAC的原理和程序,在实际应用中,我们经常需要调节电压的输出大小&…...
springboot3如何集成knife4j 4.x版本及如何进行API注解
1. 什么是Knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!knife4j的前身是swagger-bootstrap-ui,swagger-bootstrap-ui自1.9.6版本后,正式更名为knife4j为了契合微服务的架构发展,由于原来…...
【Linux网络 (二)】套接字编程
Linux: 网络 一、前言二、端口号 (port)1)port、套接字概念2)端口号 vs 进程id3)端口号和进程关系 三、认识TCP/Udp协议1)连接性解释2)可靠性解释3)面向数据报/字节流解释 四、网络字节序五、struct sockad…...
SQL 语句执行计划中的连接方式
SQL 语句执行计划中的连接方式 join操作 join操作基本分为3大类:外连接(细分为:左连接(Left outer join/ left join)、右连接(right outer join/ right join)、全连接(full outer …...
3、集线器、交换机、路由器、ip的关系。
集线器、交换机、路由器三者的关系 1、集线器2、交换机(每个交换机是不同的广播域,ip地址起到划分广播域的作用)3、 路由器4、ip地址 1、集线器 一开始两台电脑通信就需要网线就可以,但是三台或者更多主机通信时,就需…...
OpenCV相机标定与3D重建(3)校正鱼眼镜头畸变的函数calibrate()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::fisheye::calibrate 函数是 OpenCV 中用于校正鱼眼镜头畸变的一个重要函数。该函数通过一系列棋盘格标定板的图像来计算相机的内参矩阵和畸变…...
【论文笔记】LLaVA-KD: A Framework of Distilling Multimodal Large Language Models
Abstract 大语言模型(Large Language Models, LLM)的成功,使得研究者为了统一视觉和语言的理解去探索多模态大预言模型(Multimodal Large Language Models, MLLM)。 但是MLLM庞大的模型和复杂的计算使其很难应用在资源受限的环境,小型MLLM(s-MLLM)的表现…...
C++内存管理和模板
文章目录 1. C内存管理1.1 new1.1.1 内置类型1.1.2 自定义类型1.1.3 定位new表达式1.1.4 new的优势与不足1.1.5 new的原理 1.2 delete1.2.1 内置类型1.2.2 自定义类1.2.3 delete和free1.2.4 delete原理 1.3 new和delete的对应1.3.1 内置类型1.3.2 自定义类型 2. 模板2.1 函数模…...
Docker 容器化开发 应用
Docker 常用命令 存储 - 目录挂载 存储 卷映射 自定义网络 Docker Compose语法 Dockerfile - 制作镜像 镜像分层机制 完结...
element-plus教程:Input Number 数字输入框
一、基础用法 要使用Input Number数字输入框,只需要在<el-input-number>元素中使用v-model绑定变量即可。例如: <template><el-input-number v-model"value" /> </template><script lang"ts" setup>…...
【Go语言成长之路】编写web应用
文章目录 编写Web应用一、介绍二、创建项目2.1 创建wiki数据结构2.2 介绍net/http包(小插曲)2.3 使用 net/http 提供 wiki 页面2.4 编辑Pages2.5 html/template包2.6 处理不存在的页面2.7 保存页面2.8 错误处理2.9 模板缓存2.10 验证2.11 函数文字和闭包…...
Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化
1. 对象在内存中的布局分为三块区域: (1)对象头(Mark Word、元数据指针和数组长度) 对象头:在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中࿰…...
安宝特分享 | 如何利用AR技术革新医疗实践:从远程急救到多学科协作
AR技术在国内外医院的应用 在现代医疗环境中,患者面临的挑战依然严峻:看病难、看病远、看病急。这些问题不仅影响了患者的治疗效果,也让医务工作者倍感压力。幸运的是,随着增强现实(AR)技术的发展…...
小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译
本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5,你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…...
vue2-基础核心
vue简介 动态构建用户界面的渐进式 JavaScript 框架 vue的特点: 遵循MVVM模式 采用组件化模式,提高代码复用率,让代码更好维护 声明式编码,无需直接操作DOM,提高开发效率,编码简洁、体积小,运行效率高 本…...
使用 前端技术 创建 QR 码生成器 API1
前言 QR码(Quick Response Code)是一种二维码,于1994年开发。它能快速存储和识别数据,包含黑白方块图案,常用于扫描获取信息。QR码具有高容错性和快速读取的优点,广泛应用于广告、支付、物流等领域。通过扫…...