逼近条件期望 E(X|Y)

Approximating the conditional expectation E(X|Y)

我试图找到一种方法来近似 python 中的条件期望 E(X|Y)。 我只有两个数字列表,X 和 Y,我对它们一无所知。

有什么好的方法吗? 我尝试使用各种更平滑的函数,但结果一点也不好。

例如,
X = [ 1, 1, 1, 1, ....] and Y = [1, -1, 1, -1, ...] 我希望 E(X|Y) = 1 因为 X 是常量不管 Y.

我要在这里做一些假设:

  • 1对应True,-1对应False
  • XY等长且相互独立
  • XY 存储在列表中

下面是贝叶斯统计的复习(我不会在这里写方程,抱歉):

P(X) = probability of X being True = (# of True elements in X) / (# of elements in X)

P(Y) = probability of Y being True = (# of True elements in Y) / (# of elements in Y)

P(X and Y) = probability of both X and Y being True = P(X) * P(Y)

P(X given Y) = P(X | Y) = probability of X being True given that Y is True = P(X and Y) / P(Y)

以下是将其实现到代码中的方法:

X = np.array(X, dtype=int)
Y = np.array(Y, dtype=int)

p_X = len(np.where(X == 1)[0]) / len(X)
p_Y = len(np.where(Y == 1)[0]) / len(Y)

p_X_and_Y = p_X * p_Y
p_X_given_Y = p_X_and_Y / p_Y

这给出了 p_X_given_Y = 1 的正确答案。

你的问题其实很宽泛,所以你的问题的答案很多。广义地看待机器学习这个术语,这是人们长期以来一直试图在机器学习中回答的一个问题。答案实际上取决于您对 X|Y 的分布以及 X 和 Y 之间的关系所做的假设。

我建议使用 sci-kit 学习包,因为它提供了多种计算 E(X|Y) 的方法。让我们从您的示例开始并使用简单的线性回归(假设 X 和 Y 之间的关系是线性的)

import numpy as np
from sklearn.linear_model import LinearRegression
X = np.ones((100,1))
Y = np.ones((100,1))
Y[0:-1:2] = -1
LR = LinearRegression()
LR.fit(Y,X)
a = LR.coef_
b = LR.intercept_

现在在这种情况下,因为我们假设线性关系 E(X|Y) = aY + b 并且在上面的示例中线性回归告诉我们 a = 0 和 b = 1。这给了你条件期望您所期望的(无论 Y 的值如何,所有期望值都等于 1)。

正如我提到的,尽管有很多方法可以尝试估计 E(X|Y),例如可以使用 k-nearest 邻居(并在 sklearn 中实现)或高斯过程回归 (GPR)这两者都不需要假设变量之间存在线性关系(当然工作方式非常不同,GPR 需要一个核函数,我们从 Mercer 定理中知道它允许我们为适合的函数选择不同级别的平滑度数据,而 k-nearest neighbors 通过对它的 k-nearest 邻居进行平均来估计每个点的 E(X|Y),这是通过某个距离函数测量的)。您可以在这个精彩的包中探索更多示例。这是一个非常有趣的领域!

编辑:现在我将为 KNN 和高斯过程回归添加一些示例代码

import numpy as np

from sklearn.neighbors import KNeighborsRegressor

X = np.ones(100)
Y = np.ones(100)

Y[0:-1:2] = -1
X = X.reshape(1,-1)
Y = Y.reshape(1,-1)

neigh = KNeighborsRegressor(n_neighbors=1)

neigh.fit(Y, X)
print(neigh.predict(Y))

这 returns 所有的,再次符合预期。请注意,在 KNN E(X|Y) = Ave(neighbors(X)) 的情况下,因此不需要是线性的(甚至不需要平滑)。

import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import DotProduct, WhiteKernel

X = np.ones(100)
Y = np.ones(100)

Y[0:-1:2] = -1
X = X.reshape(1,-1)
Y = Y.reshape(1,-1)

kernel = DotProduct() + WhiteKernel()
gpr = GaussianProcessRegressor(kernel=kernel).fit(Y,X)

print(gpr.predict(Y))

以上示例用于高斯过程回归,它产生的数字数组非常接近(但不完全是)预期的 1。请注意,变量之间的关系被假定为具有一定程度的平滑度,具体取决于内核。在这种情况下,常量内核应该可以正常工作,但我想我们可以举一个例子来说明如何选择内置内核。