本帖最后由 SilverWolf 于 2022-11-2 18:03 编辑
贝叶斯(一种基于概率判断事件的方法)
最新一次更新:2022/11/2
本文基于官方文档说明文件进行人工翻译。部分字段使用了机翻。如果有朋友发现翻译不恰当的地方望留言指出,我会第一时间跟进修改。
不了解贝叶斯的朋友可以先阅读下
lidicn大神写的文章https://bbs.hassbian.com/thread-4813-1-1.html
通过使用贝叶斯(bayesian)二进制传感器,可以监视多个传感器的状态,以贝叶斯定理(概率)根据指定传感器状态推测事件发生的概率。如果概率高于设定的阈值,则传感器打开,否则关闭。
这将更容易检测一些不易判断的复杂事件,例如烹饪、淋浴、是否上床、早晨例行活动的开始等。它可用于获取传感器不易直接监测到的状态。此时你需要依赖贝叶斯(概率)推测某一事件的状态。在达到可信赖的值时触发。例如:推测某些人或物是否存在。
理论
贝叶斯法则的一个关键概念是 "给定观察的事件之间的差异“。在某些情况下,这些概率是相似的。例如:房间内人体传感器检测到运动的概率与有人在房间里的概率近似,因为有人在房间里。在其他情况下,这种区别要重要得多。每次前门接触传感器报告开门时,我刚到家的概率(事件)(p=0.2)【可理解为20%】与我回家时前门接触传感器被触发的概率(p=0.999)是不同的。
在configuration中,可以使用指定事件(根据相关传感器状态)的概率推测(写入二进制传感器的状态)
估算概率
1、避免使用0和1,这些会扰乱概率,因为在概率学0% 100%是几乎不存在的,如果你要是100%那你还不如用(如果-就 if-else)去判断。
2、当使用0.99和0.001时。9和0的数量很重要。
3、大多数概率将是基于时间的--某件事情在同一时间所占据的比例也是它的概率。
4、使用HomeAssistant历史记录可以帮助你设置概率。
prob_given_true:在您认为贝叶斯传感器应该为真的时间范围内选择传感器。prob_given_true:是传感器处于 to_state 的时间分数
prob_given_false:在您认为贝叶斯传感器应该为假的时间范围内选择传感器查询。 prob_given_false:是传感器进入状态的时间分数
5、不要试图调整prob_given_true和prob_given_false来获得你想要的结果和行为,使用(第4条)来尝试并获得尽可能接近 "真相 "的概率,如果你的行为不符合预期,考虑添加更多的传感器。(第6条)
6、如果你的贝叶斯传感器最终太容易触发,重新检查所设置的概率是否合理,然后考虑增加probability_threshold,反之亦然。
配置
若要启用贝叶斯传感器,请将以下列行添加到 configuration.yaml 中
# 示例 configuration.yaml 条目
binary_sensor:
- platform: bayesian
prior: 0.1
observations:
- entity_id: "switch.kitchen_lights"
prob_given_true: 0.6
prob_given_false: 0.2
platform: "state"
to_state: "on"
配置变量
prior float 必填
该事件的先验概率(0到1)。在任何时间点上(忽略所有的外部影响),这个事件发生的可能性有多大?
probability_threshold 浮点 (可选, 默认值: 0.5)
传感器应触发为开启的后验概率。使用较高的值来减少假阳性(和增加假阴性) 注意:如果阈值高于先验,那么默认状态将是关闭。
name string (可选, 默认值: Bayesian Binary Sensor)
要在UI使用的传感器名称。
device_class 字符串 (可选)
更改设备的类,更改前端UI显示的设备状态和图标。
observations list 必填
应该影响给定事件发生概率的观察。
platform 字符串 必填
支持的platform有state、numeric_state和template。它们的模型是根据其相应的自动化触发器
要求to_state(用于状态),低于总和/或高于(数字状态)或value_template(用于模板)。
entity_id 字符串 (可选)
要监视的实体名称。对于state和numeric_state是必需的。
to_state 字符串 (可选)
定义观察的实体状态。需要(for state).
value_template template (可选)
定义要使用的模板,应评估为真或假。对模板来说是必需的。
prob_given_true 浮点 必填
当贝叶斯二进制传感器为true时所需要的实体状态可信度概率。
prob_given_false 浮点 必填
当贝叶斯二进制传感器为false时所需要的实体状态可信度概率。
完整示例
以下是stateobservation platform的示例
# 示例 configuration.yaml 条目
binary_sensor:
name: "in_bed"
platform: "bayesian"
prior: 0.25 # 我每天花6个小时在床上6小时/24小时是0.25
probability_threshold: 0.8 # 我将使用此传感器来熄灯,所以我只想在确定时激活
observations:
- platform: "state"
entity_id: "sensor.living_room_motion"
prob_given_true: 0.05 # 如果我在床上,那么我不应该在客厅里,但是我偶尔会有客人
prob_given_false: 0.2 # 我的传感器历史记录显示如果我不在床上,我会花大约五分之一的时间在客厅里
to_state: "on"
- platform: "state"
entity_id: "sensor.basement_motion"
prob_given_true: 0.5 # 我的传感器历史记录显示,当我躺在床上时,由于我的猫,我的地下室运动传感器大约一半的时间处于活动状态
prob_given_false: 0.3 # 如上所述,但我的猫在我醒着时倾向于在楼上或外面花更多的时间,且我很少使用地下室
to_state: "on"
- platform: "state"
entity_id: "sensor.bedroom_motion"
prob_given_true: 0.5 # 我的传感器历史记录显示,当我躺在床上时,传感器大约一半的时间会检测到我
prob_given_false: 0.1 # 我的传感器历史记录显示,我大约 10% 的清醒时间都在卧室里度过
to_state: "on"
- platform: "state"
entity_id: "sun.sun"
prob_given_true: 0.7 # 如果我躺在床上,那么太阳很有可能会下山,但在夏天的早晨,我可能仍然在床上。
prob_given_false: 0.45 # 如果我醒着,那么太阳很有可能在地平线以下 - 特别是在冬天
to_state: "below_horizon"
- platform: "state"
entity_id: "sensor.android_charger_type"
prob_given_true: 0.95 # 当我躺在床上时,我几乎总是插上手机充电
prob_given_false: 0.1 # 当我醒来时,我偶尔会给手机充电
to_state: "ac"
接下来是一个针对numeric_state观察平台的例子,从配置上看,它需要低于总和/或高于它,来替代to_state
binary_sensor:
name: "Heat On"
platform: "bayesian"
prior: 0.2
probability_threshold: 0.9
observations:
- platform: "numeric_state"
entity_id: "sensor.outside_air_temperature_fahrenheit"
prob_given_true: 0.95
prob_given_false: 0.05
below: 50
最后,这里有一个例子,从配置上看,它需要value_template。如果设备追踪器device_tracker.paulus显示not_home,并且它最后一次改变状态是在5分钟之前,这个模板将返回true。
# 示例 configuration.yaml 条目
binary_sensor:
name: "Paulus Home"
platform: "bayesian"
device_class: "presence"
prior: 0.5
probability_threshold: 0.9
observations:
- platform: template
value_template: >
{{is_state('device_tracker.paulus','not_home') and ((as_timestamp(now()) - as_timestamp(states.device_tracker.paulus.last_changed)) > 300)}}
prob_given_true: 0.05
prob_given_false: 0.99
|