如何根据 PyMC3 中的另一个值测量一个值的贝叶斯不确定性
How to measure Bayesian uncertainty of a value based on another value in PyMC3
我的数据看起来像这样:
Player | Avg_goals | Minutes played
A | 10 | 100
B | 12.1 | 900
C | 15 | 1600
D | 8.3 | 3200
E | 3 | 750
...
Z | 2.4 | 420
我想做什么
是为不确定性来源为 Minutes
值的任何玩家建模并获得 true avg_goals
。
因为,我更确定 true 率更接近记录的 Avg_goals
,其中 Minutes
是 high 而对于 less 分钟的球员来说,他们的 true 率越接近该值,方差越大,不确定性也越大在 Avg_goals
列中。所以我更确定玩家 D 的比率比玩家 Z 的(记录值 = 2.4)更接近 8.3,因为分钟数。
问题
我不确定如何在 PyMC3 模型中描述 Avg_goals
和 Minutes
之间的这种关系。
我决定在目标列中使用泊松先验,但在那之后我不知道如何进行。到目前为止我的(不完整的)代码是
import pymc3 as pm
import numpy as np
minutes = np.array([100, 900, 1600, 3200, 750])
goals_ = np.array([10, 12.1, 15, 8.3, 3])
with pm.Model() as model:
lambda = pm.Normal('lambda', goals_.mean())
goals_ = pm.Poisson('goals_', lambda)
###NO IDEA WHAT COMES NEXT??!!
如有任何帮助,我们将不胜感激。如果我能在 PyMC3 中实现类似的示例,那就太好了。
如果没有实际的重复,不确定性如何随时间变化将是任意的。但是,您是正确的,至少可以观察到不确定性的相对关系。只是不确定性的绝对单位将取决于先验中所做的选择。
为了简化模型,我建议使用 minutes_played
和 total_goals
,而不是 OP 中的变量。我们仍然可以指定 goal_rate
输出,但它将是模型参数的确定性函数。应该注意的是,OP 数据中给出的一些条目没有任何意义。例如,没有一个球员在 1600 分钟的比赛中可以取得的进球总数会导致 15 goals/90 分钟的进球率。因此,我更改了数据以使其有效。
二项式回归模型
作为第一步,我将提出一个二项式回归模型,我们将 total_goals
玩家制作的模型建模为二项式随机变量,其中 N 对应于 minutes_played
和比率每分钟 player-specific 个目标。回归部分是我们假设所有球员都有一个共同的平均进球率,我们将推断一个 player-specific 系数来定义他们与平均值的偏差。
这不是一个精确的模型。例如,它假设所有球员的得分率都在每分钟 0 到 1 个进球 (GPM) 之间。虽然GPM超过1在逻辑上没有什么不可能,但实际上是不可信的,所以我认为这个模型不无道理。
数据
minutes_played = np.array([10, 90, 750, 900, 1800, 3600])
goals_per_game = np.array([18, 10, 3, 12.1, 15, 8.3])
total_goals = goals_per_game * minutes_played / 90
n_players = len(total_goals)
型号
with pm.Model() as model:
# regression model coefficients
c_player = pm.Normal('c_player', 0, tau=1, shape=n_players)
c_mu = pm.Normal('c_mu', 0, 10)
# goals per minute (by player)
gpm = pm.math.invlogit(c_mu + c_player)
# intuitive variables
pm.Deterministic('avg_goal_rate', pm.math.invlogit(c_mu)*90)
pm.Deterministic('goal_rate', gpm*90)
# log-likelihood
pm.Binomial('llik', n=minutes_played, p=gpm, observed=total_goals)
trace = pm.sample()
结果
这似乎没有太大问题:
“直观”变量的后验分布通常反映了人们的预期,即上场时间更少的球员的不确定性更高:
pm.plot_forest(trace, var_names=['avg_goal_rate', 'goal_rate'])
缩放不确定性
在这个模型中,调节不确定性尺度的参数是c_player = pm.Normal('c_player', 0, tau=1, shape=n_players)
中的tau
参数。就模型而言,这种精确度调节了球员真正偏离平均进球率的可能性;更高的精度意味着更低的合理性。我建议尝试使用这个值(例如 0.1、10),看看它如何改变每个球员进球率的不确定性。
我的数据看起来像这样:
Player | Avg_goals | Minutes played
A | 10 | 100
B | 12.1 | 900
C | 15 | 1600
D | 8.3 | 3200
E | 3 | 750
...
Z | 2.4 | 420
我想做什么
是为不确定性来源为 Minutes
值的任何玩家建模并获得 true avg_goals
。
因为,我更确定 true 率更接近记录的 Avg_goals
,其中 Minutes
是 high 而对于 less 分钟的球员来说,他们的 true 率越接近该值,方差越大,不确定性也越大在 Avg_goals
列中。所以我更确定玩家 D 的比率比玩家 Z 的(记录值 = 2.4)更接近 8.3,因为分钟数。
问题
我不确定如何在 PyMC3 模型中描述 Avg_goals
和 Minutes
之间的这种关系。
我决定在目标列中使用泊松先验,但在那之后我不知道如何进行。到目前为止我的(不完整的)代码是
import pymc3 as pm
import numpy as np
minutes = np.array([100, 900, 1600, 3200, 750])
goals_ = np.array([10, 12.1, 15, 8.3, 3])
with pm.Model() as model:
lambda = pm.Normal('lambda', goals_.mean())
goals_ = pm.Poisson('goals_', lambda)
###NO IDEA WHAT COMES NEXT??!!
如有任何帮助,我们将不胜感激。如果我能在 PyMC3 中实现类似的示例,那就太好了。
如果没有实际的重复,不确定性如何随时间变化将是任意的。但是,您是正确的,至少可以观察到不确定性的相对关系。只是不确定性的绝对单位将取决于先验中所做的选择。
为了简化模型,我建议使用 minutes_played
和 total_goals
,而不是 OP 中的变量。我们仍然可以指定 goal_rate
输出,但它将是模型参数的确定性函数。应该注意的是,OP 数据中给出的一些条目没有任何意义。例如,没有一个球员在 1600 分钟的比赛中可以取得的进球总数会导致 15 goals/90 分钟的进球率。因此,我更改了数据以使其有效。
二项式回归模型
作为第一步,我将提出一个二项式回归模型,我们将 total_goals
玩家制作的模型建模为二项式随机变量,其中 N 对应于 minutes_played
和比率每分钟 player-specific 个目标。回归部分是我们假设所有球员都有一个共同的平均进球率,我们将推断一个 player-specific 系数来定义他们与平均值的偏差。
这不是一个精确的模型。例如,它假设所有球员的得分率都在每分钟 0 到 1 个进球 (GPM) 之间。虽然GPM超过1在逻辑上没有什么不可能,但实际上是不可信的,所以我认为这个模型不无道理。
数据
minutes_played = np.array([10, 90, 750, 900, 1800, 3600])
goals_per_game = np.array([18, 10, 3, 12.1, 15, 8.3])
total_goals = goals_per_game * minutes_played / 90
n_players = len(total_goals)
型号
with pm.Model() as model:
# regression model coefficients
c_player = pm.Normal('c_player', 0, tau=1, shape=n_players)
c_mu = pm.Normal('c_mu', 0, 10)
# goals per minute (by player)
gpm = pm.math.invlogit(c_mu + c_player)
# intuitive variables
pm.Deterministic('avg_goal_rate', pm.math.invlogit(c_mu)*90)
pm.Deterministic('goal_rate', gpm*90)
# log-likelihood
pm.Binomial('llik', n=minutes_played, p=gpm, observed=total_goals)
trace = pm.sample()
结果
这似乎没有太大问题:
“直观”变量的后验分布通常反映了人们的预期,即上场时间更少的球员的不确定性更高:
pm.plot_forest(trace, var_names=['avg_goal_rate', 'goal_rate'])
缩放不确定性
在这个模型中,调节不确定性尺度的参数是c_player = pm.Normal('c_player', 0, tau=1, shape=n_players)
中的tau
参数。就模型而言,这种精确度调节了球员真正偏离平均进球率的可能性;更高的精度意味着更低的合理性。我建议尝试使用这个值(例如 0.1、10),看看它如何改变每个球员进球率的不确定性。