2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 численное взятие интеграла
Сообщение23.05.2012, 15:08 


27/10/09
602
Такая задача: есть две группы случайных величин с многомерным нормальным распределением с разными параметрами (каждая группа со своими параметрами). Вопрос о принадлежности какого-то измерения той или иной группе решается по величине плотности распределения. Тогда ошибка классификации (вероятность неправильной классификации) может быть посчитана как $\int \min (P_1(\bar{x}), P_2(\bar{x})) \, d \bar{x}$, где $P_1(\bar{x}) $ и $P_2(\bar{x}) $ - плотности вероятности первой и второй группы соответственно.
Вопрос такой: как посчитать эту вероятность при больших размерностях пространства? Вольфрамовская Математика ругается и говорит, что интеграл ноль.

 Профиль  
                  
 
 Re: численное взятие интеграла
Сообщение23.05.2012, 15:17 
Заслуженный участник


25/02/11
1797
Можно попробовать метод Монте-Карло:
Код:
NIntegrate[..., Method->"MonteCarlo"]

или
Код:
NIntegrate[..., Method->"AdaptiveMonteCarlo"]

 Профиль  
                  
 
 Re: численное взятие интеграла
Сообщение23.05.2012, 16:35 


27/10/09
602
Так то да, но чего-то не так получается:
генерируем выборку, так чтобы не все корреляции были нулевыми
Код:
ClearAll[r]
seq = Join[Sequence @@ Table[Transpose[RandomReal[MultinormalDistribution[{0, 0}, {{1, r}, {r, 1}}],100]], {r, -0.8, 0.8, 0.4}]] // Transpose;
{n, m} = Dimensions[seq]


оцениваем по ней распределение, вектор средних и ковариационную матрицу:
Код:
ClearAll[a, s]
A = Array[a, m];
S = Array[s, {m, m}];
dist = EstimatedDistribution[seq, MultinormalDistribution[A, S]];
av = Mean[dist];
cov = Covariance[dist];


В качестве пределов интегрирования возьмем по три сигмы туда-сюда от среднего, и интегрируем:
Код:
fu = PDF[dist, A]
V = Table[{a[j], av[[j]] - 3 Sqrt[cov[[j, j]]], av[[j]] + 3 Sqrt[cov[[j, j]]]}, {j, m}]
NIntegrate[Evaluate[fu], Evaluate[Sequence @@ V], Method -> "MonteCarlo"]
NIntegrate[Evaluate[fu], Evaluate[Sequence @@ V], Method -> "AdaptiveMonteCarlo"]


Для MonteCarlo у меня стабильно получается цифра в районе 0.8-0.9, для AdaptiveMonteCarlo в районе 0.4, а должно быть примерно 1. Причем расширение пределов интегрирования только ухудшает ситуацию.

 Профиль  
                  
 
 Re: численное взятие интеграла
Сообщение23.05.2012, 17:06 
Заслуженный участник


25/02/11
1797
Может, точек маловато. Тогда надо увеличивать их число: MaxPoints->10^4 или сколько надо.

 Профиль  
                  
 
 Re: численное взятие интеграла
Сообщение26.05.2012, 17:40 


27/10/09
602
Vince Diesel в сообщении #575171 писал(а):
Может, точек маловато. Тогда надо увеличивать их число: MaxPoints->10^4 или сколько надо.
Надо, оказывается, много. Поставил 10^9 (больше не берет), два интеграла считаются ночь (потому и молчал долго), результаты такие:
0.899727
1.10749
1.0164
0.559048
0.966356
0.986756
по идее должны быть все единицы. Постоянно говорит, что "The integral failed to converge after 1000000100 integrand evaluations."
Метод "MonteCarlo", поскольку "AdaptiveMonteCarlo" совсем чего-то непонятное дает.

Есть ли какая-то возможность взятия таких интегралов на современной технике?

 Профиль  
                  
 
 Re: численное взятие интеграла
Сообщение26.05.2012, 20:31 
Заслуженный участник


25/02/11
1797
Если размерность большая, то не знаю, что, кроме Монте-Карло, работало бы. Разве что символьно, что тоже вряд ли.

Ну, получается, что так можно получить точность порядка нескольких процентов. Вопрос только в том, устраивает ли это. А если надо больше точек, то можно брать среднее арифметическое. Если есть несколько процессоров, можно параллельно запускать.

 Профиль  
                  
 
 Re: численное взятие интеграла
Сообщение28.05.2012, 10:36 


27/10/09
602
Vince Diesel в сообщении #576815 писал(а):
Если размерность большая, то не знаю, что, кроме Монте-Карло, работало бы. Разве что символьно, что тоже вряд ли.

Символьно нельзя, поскольку подинтегральная функция есть минимум-из-двух, а сами плотности считаются только для проверки точности счета (они должны быть примерно равны единице)

Vince Diesel в сообщении #576815 писал(а):
Ну, получается, что так можно получить точность порядка нескольких процентов. Вопрос только в том, устраивает ли это. А если надо больше точек, то можно брать среднее арифметическое. Если есть несколько процессоров, можно параллельно запускать.

Сложность в том, что эти несколько процентов и определяют задачу - здесь считается вероятность ошибки классификации. Вопрос - а что значит "брать среднее арифметическое"? Просчитать интеграл несколько раз и взять среднее? И как в Математике 8 запустить NIntegrate параллельно?

 Профиль  
                  
 
 Re: численное взятие интеграла
Сообщение28.05.2012, 11:51 
Заслуженный участник


25/02/11
1797
AndreyL в сообщении #577527 писал(а):
Просчитать интеграл несколько раз и взять среднее?

Да.
AndreyL в сообщении #577527 писал(а):
И как в Математике 8 запустить NIntegrate параллельно?

Код:
results = ParallelTable[NIntegrate[...], {k, 1, 12}]
Mean[results]

Число раз лучше брать пропорционально количеству ядер, чтобы все были загружены.

 Профиль  
                  
 
 Re: численное взятие интеграла
Сообщение28.05.2012, 12:14 


27/10/09
602
Спасибо! Буду пробовать.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group