Пакет неопределенностей в Python: использование заданной ковариационной матрицы для получения неопределенностей данных

#python #standard-deviation #propagation #uncertainty #covariance-matrix

#python #стандартное отклонение #распространение #неопределенность #ковариационная матрица

Вопрос:

Я считаю, что мою проблему довольно легко понять, но я хотел бы сделать ее предельно ясной, отсюда и длина этого сообщения.

Моя первоначальная ситуация, которую я суммирую ниже, аналогична той, которая описана в этом сообщении (https://stats.stackexchange.com/questions/50830/can-i-convert-a-covariance-matrix-into-uncertainties-for-variables) , но касается конкретно того, как неопределенности пакета python справляются с такими случаями.

Вот ситуация:

  • У меня есть массив точек данных, соответствующих номинальному значению некоторых измерений (под номинальным значением я подразумеваю голое значение без учета какой-либо неопределенности).

  • Каждая точка данных имеет свою неопределенность, которая также предоставляется мне. Более того, разные точки данных не являются независимыми, а коррелируют из-за некоторой систематики в измерениях. Таким образом, мне предоставляется целая ковариационная матрица с ненулевыми недиагональными элементами.

Что я хотел бы сделать, так это выполнить вычисления с моими данными таким образом, чтобы неопределенности распространялись соответствующим образом. В конечном итоге я хочу отобразить значения в виде номинального значения / — неопределенности в консоли. Пакет python «неопределенности» кажется правильным способом продолжения, но я не уверен в значении числа неопределенности, которое он предоставляет мне для моих начальных точек данных.

Чего я ожидал бы, так это того, что неопределенность моих исходных точек данных соответствует «наивному» стандартному отклонению, то есть квадратному корню из диагональных элементов моей ковариационной матрицы. Это игнорирует корреляции в данных, но отображение коррелированных результатов в виде номинальное значение / — неопределенность в любом случае может не показывать корреляции, и это не должно быть проблемой, если последние правильно учитываются для дальнейших вычислений.

Однако в пакете отображается другое число, являющееся неопределенностью, и я не знаю, откуда оно взялось. Документация по пакету очень мало помогает. Мне интересно, могу ли я злоупотреблять пакетом.

Кто-нибудь может помочь мне понять ситуацию? Большое спасибо!!

Вот минимальный воспроизводимый пример :

 import uncertainties
import numpy as np

# To settle ideas, here are two different covariance matrices with same diagonals 
# -> I expect them to lead to the same std deviations below, but this is not the case:

Cov_matrix1 = np.array([[0.00, 0.0,  0.0], [0.0,  1, 0], [0.0, 0, 4]], np.float64)
Cov_matrix2 = np.array([[0.00, 0.5,  3], [0.5,  1, 0.2], [3, 0.2, 4]], np.float64)

# here are some initial nominal values:

data_nominal = np.array([1, 2, 3], np.float64)

print(" The nominal values of data, whithout covariance matrix is ", data_nominal)

# I impose correlations in my data, using the above covariance matrices

correlated_data1 = np.asarray(uncertainties.correlated_values(data_nominal, Cov_matrix1))
correlated_data2 = np.asarray(uncertainties.correlated_values(data_nominal, Cov_matrix2))

# I print my data in the console, and see that data points have different uncertainties in both cases,
# even though the two covariance matrices have the same diagonals ... What is happening ? 

print("n First covariance matrix is ")
print(Cov_matrix1)
print("n Data values are ", correlated_data1)

print("n 2nd covariance matrix is ")
print(Cov_matrix2)
print("n Data values are now ", correlated_data2)

  

Ответ №1:

Я думаю, что проблема в том, что одна из ковариационных матриц является «незаконной» в том смысле, что

 Cov_matrix2 = np.array([[0.00, 0.5,  3], [0.5,  1, 0.2], [3, 0.2, 4]], np.float64)
  

не является положительным полуопределенным, оно имеет одно отрицательное собственное значение. Таким образом, работа с ним не может быть математически жизнеспособной, чего пакет не замечает. Действительно, пакет использует эту недопустимую матрицу без предупреждения или сообщения об ошибке, и, конечно, полученный результат нельзя считать значимым, отсюда и неожиданное поведение.