因果推断dowhy之-探索酒店取消预订的原因分析

2023-10-27

0x01. DoWhy案例分析

本案例依旧是基于微软官方开源的文档进行学习,有想更深入了解的请移步微软官网。
背景:
取消酒店预订可能有不同的原因。客户可能会要求一些无法提供的东西(例如,停车场),客户可能后来发现酒店没有满足他们的要求,或者客户可能只是取消了他们的整个旅行。其中一些问题,如停车,是酒店可以处理的,而另一些问题,如取消行程,则不在酒店的控制范围内。在任何情况下,我们都想更好地了解是哪些因素导致预订取消。

在本例中,我们的研究问题是估计当消费者在预定酒店时,为其分配一间与之前预定过的房间不同的房间对消费者取消当前预定的影响。分析此类问题的标准是 「随机对照试验」(Randomized Controlled Trials),即每位消费者被随机分配到两类干预中的一类:为其分配与之前预定过的房间相同或不同的房间。

我们考虑哪些因素会导致酒店预订被取消。简单经验思考如图:
在这里插入图片描述

0x02. 实验走起

0x02_1. 导包读数据

有关数据的详细解释请参考:传送门

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import dowhy

dataset = pd.read_csv('https://raw.githubusercontent.com/Sid-darthvader/DoWhy-The-Causal-Story-Behind-Hotel-Booking-Cancellations/master/hotel_bookings.csv')
dataset.columns

该数据集包含如下列:

Index(['hotel', 'is_canceled', 'lead_time', 'arrival_date_year',
       'arrival_date_month', 'arrival_date_week_number',
       'arrival_date_day_of_month', 'stays_in_weekend_nights',
       'stays_in_week_nights', 'adults', 'children', 'babies', 'meal',
       'country', 'market_segment', 'distribution_channel',
       'is_repeated_guest', 'previous_cancellations',
       'previous_bookings_not_canceled', 'reserved_room_type',
       'assigned_room_type', 'booking_changes', 'deposit_type', 'agent',
       'company', 'days_in_waiting_list', 'customer_type', 'adr',
       'required_car_parking_spaces', 'total_of_special_requests',
       'reservation_status', 'reservation_status_date'],
      dtype='object')

0x02_2. 数据处理

通过特征合并,减少原有特征维度,同时让数据更有使用价值,具体创建的数据如下:

  • Total Stay = stays_in_weekend_nights + stays_in_week_nights
  • Guests = adults + children + babies
  • Different_room_assigned = 1 if reserved_room_type & assigned_room_type are different, 0 otherwise.

操作是基本的pandas操作,跟着实践就好。

# Total stay in nights
dataset['total_stay'] = dataset['stays_in_week_nights']+dataset['stays_in_weekend_nights']
# Total number of guests
dataset['guests'] = dataset['adults']+dataset['children'] +dataset['babies']
# Creating the different_room_assigned feature
dataset['different_room_assigned']=0
slice_indices =dataset['reserved_room_type']!=dataset['assigned_room_type']
dataset.loc[slice_indices,'different_room_assigned']=1
# Deleting older features
dataset = dataset.drop(['stays_in_week_nights','stays_in_weekend_nights','adults','children','babies'
                        ,'reserved_room_type','assigned_room_type'],axis=1)
dataset.columns

数据的列经过处理后,变为:

Index(['hotel', 'is_canceled', 'lead_time', 'arrival_date_year',
       'arrival_date_month', 'arrival_date_week_number',
       'arrival_date_day_of_month', 'meal', 'country', 'market_segment',
       'distribution_channel', 'is_repeated_guest', 'previous_cancellations',
       'previous_bookings_not_canceled', 'booking_changes', 'deposit_type',
       'agent', 'company', 'days_in_waiting_list', 'customer_type', 'adr',
       'required_car_parking_spaces', 'total_of_special_requests',
       'reservation_status', 'reservation_status_date', 'total_stay', 'guests',
       'different_room_assigned'],
      dtype='object')

接着处理空值等问题:

dataset.columns
#%%
dataset.isnull().sum() # Country,Agent,Company contain 488,16340,112593 missing entries
dataset = dataset.drop(['agent','company'],axis=1)
# Replacing missing countries with most freqently occuring countries
dataset['country']= dataset['country'].fillna(dataset['country'].mode()[0])

dataset = dataset.drop(['reservation_status','reservation_status_date','arrival_date_day_of_month'],axis=1)
dataset = dataset.drop(['arrival_date_year'],axis=1)
dataset = dataset.drop(['distribution_channel'], axis=1)

# Replacing 1 by True and 0 by False for the experiment and outcome variables
dataset['different_room_assigned']= dataset['different_room_assigned'].replace(1,True)
dataset['different_room_assigned']= dataset['different_room_assigned'].replace(0,False)
dataset['is_canceled']= dataset['is_canceled'].replace(1,True)
dataset['is_canceled']= dataset['is_canceled'].replace(0,False)
dataset.dropna(inplace=True)
print(dataset.columns)
dataset.iloc[:, 5:20].head(100)

数据输出结果入下:

Index(['hotel', 'is_canceled', 'lead_time', 'arrival_date_month',
       'arrival_date_week_number', 'meal', 'country', 'market_segment',
       'is_repeated_guest', 'previous_cancellations',
       'previous_bookings_not_canceled', 'booking_changes', 'deposit_type',
       'days_in_waiting_list', 'customer_type', 'adr',
       'required_car_parking_spaces', 'total_of_special_requests',
       'total_stay', 'guests', 'different_room_assigned'],
      dtype='object')

对那些没有使用押金的数据进行统计分析,观测他们是否取消了订单

dataset = dataset[dataset.deposit_type=="No Deposit"]
dataset.groupby(['deposit_type','is_canceled']).count()

结果如下:
在这里插入图片描述
对数据进行深拷贝:

dataset_copy = dataset.copy(deep=True)

0x02_3. 简单分析假设

数据预处理完成后,我们首先针对数据进行一定的分析,考察变量之间的关系。针对目标变量 is_cancelleddifferent_room_assigned ,我们随机选取 1000 次观测查看有多少次上述两个变量的值相同(即可能存在因果关系),重复上述过程 10000 次取平均,代码如下:

counts_sum=0
for i in range(1,10000):
        counts_i = 0
        rdf = dataset.sample(1000)
        counts_i = rdf[rdf["is_canceled"]== rdf["different_room_assigned"]].shape[0]
        counts_sum+= counts_i
counts_sum/10000

最终得出的期望频数是 518,即两个变量有约 50% 的时间是不同的,我们还无法判断其中的因果关系。下面我们进一步分析预约过程中没有发生调整时(即变量 booking_changes 为 0) 两个变量相等的期望频数:

counts_sum=0
for i in range(1,10000):
        counts_i = 0
        rdf = dataset[dataset["booking_changes"]==0].sample(1000)
        counts_i = rdf[rdf["is_canceled"]== rdf["different_room_assigned"]].shape[0]
        counts_sum+= counts_i
counts_sum/10000

得出的结果为492。随后我们再分析预约过程中发生调整时的期望频数:

counts_sum=0
for i in range(1,10000):
        counts_i = 0
        rdf = dataset[dataset["booking_changes"]>0].sample(1000)
        counts_i = rdf[rdf["is_canceled"]== rdf["different_room_assigned"]].shape[0]
        counts_sum+= counts_i
counts_sum/10000

结果变成了 663,与之前产生了明显的差异。我们可以不严谨地认为预约调整这一变量是一个「混杂因子」。类似地,我们对其他变量进行分析,并作出一些假设,作为因果推断的先验知识。DoWhy 并不需要完整的先验知识,未指明的变量将作为潜在的混杂因子进行推断。

0x03. 使用DoWhy来估计因果效应

使用因果分析四步进行结果分析,具体如下

0x03_1.创建因果图

本阶段无需创建完整的因果图,即使是部分图表也足够了,其余的可以由DoWhy来计算;我们将一些可能的假设翻译成因果图:

  • market_segment 有两种取值:“TA”指的是“旅行代理商”,“TO”指的是“旅游运营商”,所以它应该会影响提前时间lead_time(即预订和到达之间的天数)。
  • country 会决定一个人是否会提早预订(即影响 lead_time )以及其喜爱的食物(即影响 meal)。
  • lead_time 会影响预订的等待时间( days_in_waiting_list )。
  • 预订的等待时间 days_in_waiting_list、总停留时间 total_stay 以及客人数量 guests 会影响预订是否被取消。
  • 之前预订的取消情况 previous_bookings_not_canceled 会影响该顾客是否为is_repeated_guest;这两个变量也会影响预订是否被取消。
  • booking_changes 会影响顾客是否被分配到不同的房间,也会影响预订取消情况。
    除了 booking_changes 这一混杂因子外,一定还存在着其他混杂因子,同时影响干预和结果。
import pygraphviz
causal_graph = """digraph {
different_room_assigned[label="Different Room Assigned"];
is_canceled[label="Booking Cancelled"];
booking_changes[label="Booking Changes"];
previous_bookings_not_canceled[label="Previous Booking Retentions"];
days_in_waiting_list[label="Days in Waitlist"];
lead_time[label="Lead Time"];
market_segment[label="Market Segment"];
country[label="Country"];
U[label="Unobserved Confounders",observed="no"];
is_repeated_guest;
total_stay;
guests;
meal;
hotel;
U->{different_room_assigned,required_car_parking_spaces,guests,total_stay,total_of_special_requests};
market_segment -> lead_time;
lead_time->is_canceled; country -> lead_time;
different_room_assigned -> is_canceled;
country->meal;
lead_time -> days_in_waiting_list;
days_in_waiting_list ->{is_canceled,different_room_assigned};
previous_bookings_not_canceled -> is_canceled;
previous_bookings_not_canceled -> is_repeated_guest;
is_repeated_guest -> {different_room_assigned,is_canceled};
total_stay -> is_canceled;
guests -> is_canceled;
booking_changes -> different_room_assigned; booking_changes -> is_canceled;
hotel -> {different_room_assigned,is_canceled};
required_car_parking_spaces -> is_canceled;
total_of_special_requests -> {booking_changes,is_canceled};
country->{hotel, required_car_parking_spaces,total_of_special_requests};
market_segment->{hotel, required_car_parking_spaces,total_of_special_requests};
}"""

基于上述因果图,构建模型:

model= dowhy.CausalModel(
        data = dataset,
        graph=causal_graph.replace("\n", " "),
        treatment="different_room_assigned",
        outcome='is_canceled')
model.view_model()
from IPython.display import Image, display
display(Image(filename="causal_model.png"))

构建的结果如图:
在这里插入图片描述
(PS:我也不知道这吊图怎么这么糊,出来就是这样)

0x03_2. 识别因果效应

我们称 干预(Treatment) 导致了结果(Outcome) 当且仅当在其他所有状况不变的情况下,干预的改变引起了结果的改变。因果效应即干预发生一个单位的改变时,结果变化的程度。下面我们将使用因果图的属性来识别因果效应的估计量。

identified_estimand = model.identify_effect()
print(identified_estimand)

输出结果如下:

Estimand type: nonparametric-ate

### Estimand : 1
Estimand name: backdoor
Estimand expression:
            d                                                                 
──────────────────────────(E[is_canceled|guests,booking_changes,days_in_waitin
d[different_room_assigned]  

g_list,is_repeated_guest,hotel,lead_time,total_of_special_requests,required_car_parking_spaces,total_stay])

Estimand assumption 1, Unconfoundedness: If U→{different_room_assigned} and U→is_canceled then P(is_canceled|different_room_assigned,guests,booking_changes,days_in_waiting_list,is_repeated_guest,hotel,lead_time,total_of_special_requests,required_car_parking_spaces,total_stay,U) = P(is_canceled|different_room_assigned,guests,booking_changes,days_in_waiting_list,is_repeated_guest,hotel,lead_time,total_of_special_requests,required_car_parking_spaces,total_stay)

### Estimand : 2
Estimand name: iv
No such variable(s) found!

### Estimand : 3
Estimand name: frontdoor
No such variable(s) found!

0x03_3. 因果效应估计

基于估计量,下面我们就可以根据实际数据进行因果效应的估计了。如之前所述,因果效应即干预进行单位改变时结果的变化程度。DoWhy 支持采用各种各样的方法计算因果效应估计量,并最终返回单个平均值。代码如下所示:

estimate = model.estimate_effect(identified_estimand,
                                 method_name="backdoor.propensity_score_stratification",target_units="ate")
# ATE = Average Treatment Effect
# ATT = Average Treatment Effect on Treated (i.e. those who were assigned a different room)
# ATC = Average Treatment Effect on Control (i.e. those who were not assigned a different room)
print(estimate)

输出结果如下:

*** Causal Estimate ***

## Identified estimand
Estimand type: nonparametric-ate

### Estimand : 1
Estimand name: backdoor
Estimand expression:
            d                                                                 
──────────────────────────(E[is_canceled|guests,booking_changes,days_in_waitin
d[different_room_assigned]                                                                                                                       
g_list,is_repeated_guest,hotel,lead_time,total_of_special_requests,required_car_parking_spaces,total_stay])

Estimand assumption 1, Unconfoundedness: If U→{different_room_assigned} and U→is_canceled then P(is_canceled|different_room_assigned,guests,booking_changes,days_in_waiting_list,is_repeated_guest,hotel,lead_time,total_of_special_requests,required_car_parking_spaces,total_stay,U) = P(is_canceled|different_room_assigned,guests,booking_changes,days_in_waiting_list,is_repeated_guest,hotel,lead_time,total_of_special_requests,required_car_parking_spaces,total_stay)

## Realized estimand
b: is_canceled~different_room_assigned+guests+booking_changes+days_in_waiting_list+is_repeated_guest+hotel+lead_time+total_of_special_requests+required_car_parking_spaces+total_stay
Target units: ate

## Estimate
Mean value: -0.23589558877628428

0x03_4. 反驳结果

实际上,上述因果并不是基于数据,而是基于我们所做的假设(即提供的因果图),数据只是用于进行统计学的估计。因此,我们需要验证假设的正确性。DoWhy 支持通过各种各样的鲁棒性检查方法来测试假设的正确性。下面进行其中几项测试:

  • 添加随机混杂因子。如果假设正确,则添加随机的混杂因子后,因果效应不会变化太多。
refute1_results=model.refute_estimate(identified_estimand, estimate,
        method_name="random_common_cause")
print(refute1_results)

结果如下:

Refute: Add a random common cause
Estimated effect:-0.23589558877628428
New effect:-0.2387463245344759
p value:0.19999999999999996
  • 安慰剂干预。将干预替换为随机变量,如果假设正确,因果效应应该接近 0。
refute2_results=model.refute_estimate(identified_estimand, estimate,
        method_name="placebo_treatment_refuter")
print(refute2_results)

结果如下:

Refute: Use a Placebo Treatment
Estimated effect:-0.23589558877628428
New effect:8.214081490552981e-05
p value:0.98
  • 数据子集验证。在数据子集上估计因果效应,如果假设正确,因果效应应该变化不大。
refute3_results=model.refute_estimate(identified_estimand, estimate,
        method_name="data_subset_refuter")
print(refute3_results)

结果如下:

Refute: Use a subset of data
Estimated effect:-0.23589558877628428
New effect:-0.23518131741789491
p value:0.8

可以看到,我们的因果模型基本可以通过上述几个测试(即取得预期的结果)。因此,根据估计阶段的结果,我们得出结论:当消费者在预定房间时,为其分配之前预定过的房间(different_room_assigned = 0 )所导致的平均预定取消概率( is_canceled )要比为其分配不同的房间( different_room_assigned = 1 )低 23%

0x04. 参考

  1. 微软DoWhy官方教程之酒店预订案例实战
  2. 因果推断框架 DoWhy 入门
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

因果推断dowhy之-探索酒店取消预订的原因分析 的相关文章

  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 使用 Python Oauthlib 通过服务帐户验证 Google API

    我不想使用适用于 Python 的 Google API 客户端库 但仍想使用 Python 访问 Google APIOauthlib https github com idan oauthlib 创建服务帐户后谷歌开发者控制台 http
  • 当字段是数字时怎么说...在 mongodb 中匹配?

    所以我的结果中有一个名为 城市 的字段 结果已损坏 有时它是一个实际名称 有时它是一个数字 以下代码显示所有记录 db zips aggregate project city substr city 0 1 sort city 1 我需要修
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • 如何将 GAE 中一种 Kind 中的所有实体复制到另一种 Kind 中,而无需显式调用每个属性

    我们如何使用function clone entity 如中所述在 Python 中复制 Google App Engine 数据存储中的实体 而无需在 编译 时知道属性名称 https stackoverflow com question
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • Spider 必须返回 Request、BaseItem、dict 或 None,已“设置”

    我正在尝试从以下位置下载所有产品的图像 我的蜘蛛看起来像 from shopclues items import ImgData import scrapy class multipleImages scrapy Spider name m
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • 如何在 Flask 中的视图函数/会话之间传递复杂对象

    我正在编写一个 Web 应用程序 当 且仅当 用户登录时 该应用程序从第三方服务器接收大量数据 这些数据被解析为自定义对象并存储在list 现在 用户在应用程序中使用这些数据 调用不同的视图 例如发送不同的请求 我不确定什么是最好的模式在视

随机推荐

  • C++中的lambda表达式用法及示例

    Lambda表达式 也叫lambda函数 或简称lambda 是从C 11开始引入并不断完善的 是能够捕获作用域中变量的匿名函数对象 因为C 是不能嵌套定义函数的 所以lambda就成了我们构造闭包的主要手段 和临时短函数 本文主要展示la
  • AxureRp9画一个注册并登录界面,并验证用户名、密码不能为空,进行相应的提示信息!

    之前用Axure9做了一个关于桔梗网的注册登录的界面 这次把功能补上 注册与登录 一 之前的界面 二 添加跳转和关闭功能 三 在注册界面中 登录界面一样的步骤 验证用户名 密码不能为空 并进行相应的提示信息 四 按下F5 看结果 同理登录界
  • python无法打开excle_无法打开在python cod中创建的excel文件

    我用python代码将一些 csv文件转换为 xls 但现在当我试图打开这些文件时 却出现一个错误 COUNT DIST2 xls无法访问 文件可能已损坏 位于没有响应的服务器上 或者是只读的 我在这个项目中创建了许多其他文件 它们都是 c
  • dubbo集群之Router模块

    dubbo如何集成路由 1 默认路由是怎么设置的 消费者服务启动时 会监听注册中心的变更 所以我调用下面的方法 RegistryDirectory public synchronized void notify List
  • Matlab画时域和频谱图

    data audioread filename wav wavread plot data spectrogram data 8192 7168 8192 44100 yaxis S F T P spectrogram x window n
  • 什么是dll

    DLL的概念 DLL Dynamic Link Library 文件为动态链接库文件 又称 应用程序拓展 是软件文件类型 在Windows中 许多应用程序并不是一个完整的可执行文件 它们被分割成一些相对独立的动态链接库 即DLL文件 放置于
  • 隐藏DLL模块( HideDll)

    void HideDll HMODULE hMod GetModuleHandle MyHook dll PLIST ENTRY Head Cur PPEB LDR DATA ldr PLDR MODULE ldm asm mov eax
  • Unity ref 和out、 params的使用

    相信很多刚接触C 或者unity的同学 都会看到很多这样那样的函数 带有ref out 或者params的参数 今天我就来讲一讲这三者的使用和区别 ref 直接来看看实现的代码 public void UpdateScore ref int
  • 常见Code Review过程中发现的问题

    软件环境 Spring MVC MyBatis 主要体现在两个方面 一个是编码习惯问题 另一个是编码质量的问题 编码习惯主要有日志编写 代码注释以及编码风格的问题 而编码质量则与很多方面相关 比如轮子的使用 数据交互 逻辑精简程度等等 下面
  • jdcob--Could not initialize class com.jacob.com.ComThread

    1 dll 文件 放在tomcat bin 下面 2 dll 文件 放在c windows system32 下面 3 dll jar 文件 放在 WEB INF lib 下面
  • 服务器CPU占用过高如何解决

    1 定位出来使用资源CPU最多的进程 不管是Windows还是linux或者Mac 这个都可以通过任务管理器很快的定位出来 2 定位为什么这个进程耗费CPU资源多 通常的原因有 程序本身本身就是CPU密集型的任务 而且程序正处于工作状态 某
  • VS2019设置easyx图形库

    easyx图形库里面的graphics h头文件非常好用但是VS不能使用怎么办我了教给你设置 让在VS2019上也能愉快的使用easyx图形库 1 下载easyx图形库 我这里提供的是EasyX 2020 百度云链接 https pan b
  • Hibernate Annotation注解和关系映射

    1 Hibernate Annotation关系映射有下面几种类型 1 一对一外键关联映射 单向 2 一对一外键关联映射 双向 3 一对一主键关联映射 不重要 在这不演示 在实际中很少用 使用注解 PrimaryKeyJoinColumn
  • 浅谈游戏被唾弃的原因

    游戏为什么会被唾弃 为什么家长觉得要禁止孩子玩游戏 这是一个很值得深思的问题 今天上课时 大家正好辩论了这一点 我也想说说我的看法 欢迎大家讨论 一起为游戏行业的未来发展寻找一个方向 来自一个梦想成为游戏开发者的请求 首先 有人厌恶游戏的原
  • 到底什么是非线性规划?

    本文转自新浪博客 到底什么是非线性优化 作者 那些年的那些偏执 网址 http blog sina com cn s blog 7445c2940102x3x4 html 作者系在读博士生 文章写的非常浅显易懂 本文除转载之外 做简单修改整
  • 以半加器实现全加器

    module fulladder input wire in 1 input wire in 2 input wire cin 进位 output wire sum output wire count wire hfsum1 wire hf
  • CNN-LSTM多变量回归预测(Matlab) 基于卷积-长短期记忆网络(CNN-LSTM)的数据回归预测

    CNN LSTM多变量回归预测 Matlab 基于卷积 长短期记忆网络 CNN LSTM 的数据回归预测 1 CNN结合LSTM做拟合回归预测 数据多维输入单维输出 代码内注释详细 直接替换数据就可以使用 2 运行环境Matlab2020b
  • Android 蓝牙串口通信工具类 SeriaPortUtil 2.0.+

    原文地址 https www shanya world archives 2fd981ea html SerialPortUtil 提示 最新版本 3 0 已发布 其对比 2 0 版本 API有了很大改动 且修复了很多bug 并带来一些新的
  • jeecgboot数据权限用法

    添加数据规则 菜单管理中给需要数据权限的菜单加数据规则 Jeecg Boot 数据权限用法 编码 描述 sys user code 当前登录用户登录账号 sys user name 当前登录用户真实名称 sys date 当前系统日期 sy
  • 因果推断dowhy之-探索酒店取消预订的原因分析

    0x01 DoWhy案例分析 本案例依旧是基于微软官方开源的文档进行学习 有想更深入了解的请移步微软官网 背景 取消酒店预订可能有不同的原因 客户可能会要求一些无法提供的东西 例如 停车场 客户可能后来发现酒店没有满足他们的要求 或者客户可