[英]multivariate normal pdf with nan in mean
當x中存在缺失值時,Python 中是否有有效的實現來評估多元正態分布的 PDF? 我想這個想法只是你可以有效地將維度減少到你試圖評估概率的特定向量的可用數據點數量。 但我不知道 scipy 實現是否有辦法忽略屏蔽值。
例如,
from scipy.stats import multivariate_normal as mvnorm
import numpy as np
means = [0.0,0.0,0.0]
cov = np.array([[1.0,0.2,0.2],[0.2,1.0,0.2],[0.2,0.2,1.0]])
d = mvnorm(means,cov)
x = [0.5,-0.2,np.nan]
d.pdf(x)
產生輸出:
nan
(如預期)
有沒有一種方法可以使用此實現有效地評估僅存在的值的 PDF(在這種情況下,有效地將 3D 案例轉換為雙變量案例?)?
這個問題在數學和代碼方面有點棘手。 讓我詳細說明。
首先,代碼。 scipy.stats
不提供您希望的 nan 處理。 快速代碼可能需要手動實現多元正態分布PDF並將其直接應用於 NumPy 數組。 利用矢量化是為大規模數據集有效提供此功能的唯一方法。 另一方面,下面的 nan 容錯函數nanTol_pdf()
提供了所需的功能,同時忠實於 SciPy 中實現的多元正態分布。 您可能會發現它足以滿足您的用例。
def nanTol_pdf(d, x):
'''
Function returns function value of multivariate probability density conditioned on
non-NAN indices of the input vector x
'''
assert isinstance(d, stats._multivariate.multivariate_normal_frozen) and (isinstance(x,list) or isinstance(x,np.ndarray))
# check presence of nan entries
if any(np.isnan(x)):
# indices
subIndex = np.argwhere(~np.isnan(x)).reshape(-1)
# lower-dimensional multiv. Gaussian distribution
lowDim_mean = d.mean[subIndex]
lowDim_cov = cov[np.ix_(subIndex, subIndex)]
lowDim_d = mvnorm(lowDim_mean, lowDim_cov)
return (lowDim_d.pdf(x[subIndex]))
else:
return d.pdf(x)
無論如何,我們可以做到這一點不應該阻止我們思考是否應該這樣做。
第二,數學。 從數學上講,目前還不清楚你試圖實現什么。 在您的示例中,當您使用定義不明確的輸入向量x
查詢它時,SciPy 會返回nan
。 輸出未定義,即不返回數字( nan
)似乎是最合適的答案。 聯合截斷分布d
和輸入向量x
可以規避數值問題,但會引發統計問題。 特別是,由於概率密度函數值不能被理解為(條件)概率。 此外,如果應用截斷,則僅輸出會隱藏。 請記住,只要向量中的至少一個條目是實數, nanTol_pdf()
就會很樂意提供一個非負實數作為輸出。 您的用例將決定這是否合理。
最后,我建議在繼續之前至少考慮缺失數據插補技術。 讓我知道這是否有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.