Лучший способ записать функцию Python, которая интегрирует гауссово?

Проблема в том, что файл _redirects не попадает в корень вашего репозитория, если корнем вашего репозитория не является ваш путь развертывания.

Файл _redirects должен быть помещен в корень вашего пути развертывания.

пример

В приведенном ниже примере каталог развертывания после команды сборки - public в хранилище.

root
  ├ public
  | ├ _redirects
  | └ index.html
  ├ src
  └ lib

Примечание: Помните, что вы также можете поместить перенаправления в ваш файл netlify.toml. Файл netlify.toml помещается в корень хранилища.

netlify.toml

[build]
  command = "npm run build"
  publish = "public"

[[redirects]]
  from = "https://zen-booth-7b30d6.netlify.com/*"
  to = "https://www.ionvarsescu.tk/:splat"
  status = 301
  force = true

Существует игровая площадка для постройки их из формата _redirects в netlify.toml формат

6
задан physicsmichael 4 February 2009 в 04:46
поделиться

4 ответа

Хорошо, Вы, кажется, довольно смущены несколькими вещами. Давайте запустимся вначале: Вы упомянули "многомерную функцию", но затем продолжите обсуждать обычную Кривую Гаусса с одной переменной. Это не многомерная функция: при интеграции его Вы только интегрируете одну переменную (x). Различие важно для создания, потому что существует монстр, названный "многомерным Распределением Гаусса", которое является истинной многомерной функцией и, если интегрировано, требует интеграции более чем двух или больше переменных (который использует дорогой Метод Монте-Карло, который я упомянул прежде). Но Вы, кажется, просто говорите о регулярной Гауссовой одной переменной, который намного легче работать с, интегрироваться, и все это.

Распределение Гаусса с одной переменной имеет два параметра, sigma и mu, и функция единственной переменной, которую мы обозначим x. Вы также, кажется, несете вокруг параметра нормализации n (который полезен в нескольких приложениях). Параметры нормализации обычно не включаются в вычисления, так как можно просто прикрепить их назад на в конце (помните, интеграция является линейным оператором: int(n*f(x), x) = n*int(f(x), x) ). Но мы можем нести его вокруг, если Вам нравится; нотация, которую я люблю за нормальное распределение, затем

N(x | mu, sigma, n) := (n/(sigma*sqrt(2*pi))) * exp((-(x-mu)^2)/(2*sigma^2))

(считайте что как "нормальное распределение x данный sigma, mu, и n дают... "), Пока неплохо; это соответствует функции, которую Вы имеете. Заметьте, что единственная истинная переменная здесь x: другие три параметра фиксируются для какого-то конкретного Гауссова.

Теперь для математического факта: это доказуемо верно, что все Кривые Гаусса имеют ту же форму, они просто смещаются вокруг немного. Таким образом, мы можем работать с N(x|0,1,1), названный "стандартным нормальным распределением", и просто переводят наши результаты назад в общую Кривую Гаусса. Таким образом, если у Вас есть интеграл N(x|0,1,1), можно тривиально вычислить интеграл любого Гауссова. Этот интеграл появляется так часто, что он имеет специальное имя: функция ошибок erf. Из-за некоторых старых конвенций это не точно erf; существует пара аддитивных и мультипликативных факторов, также несомых вокруг.

Если Phi(z) = integral(N(x|0,1,1), -inf, z); то есть, Phi(z) интеграл стандартного нормального распределения от минус бесконечность до z, затем это верно по определению функции ошибок это

Phi(z) = 0.5 + 0.5 * erf(z / sqrt(2)).

Аналогично, если Phi(z | mu, sigma, n) = integral( N(x|sigma, mu, n), -inf, z); то есть, Phi(z | mu, sigma, n) интеграл нормального распределения, данного параметры mu, sigma, и n от минус бесконечность до z, затем это верно по определению функции ошибок это

Phi(z | mu, sigma, n) = (n/2) * (1 + erf((x - mu) / (sigma * sqrt(2)))).

Смотрите на статью Wikipedia о нормальном CDF, если Вы хотите больше детали или доказательство этого факта.

Хорошо, это должно быть достаточным фоновым объяснением. Назад к Вашему (отредактированному) сообщению. Вы говорите, что "erf (z) в scipy.special потребовал бы, чтобы я определил точно, что t первоначально". Я понятия не имею, что Вы подразумеваете под этим; где делает t (время?) вводят в это вообще? Надо надеяться, объяснение выше демистифицировало функцию ошибок немного, и более ясно теперь относительно того, почему функция ошибок является правильной функцией для задания.

Ваш код Python в порядке, но я предпочел бы закрытие по лямбде:

def make_gauss(N, sigma, mu):
    k = N / (sigma * math.sqrt(2*math.pi))
    s = -1.0 / (2 * sigma * sigma)
    def f(x):
        return k * math.exp(s * (x - mu)*(x - mu))
    return f

Используя закрытие включает предварительное вычисление констант k и s, таким образом, возвращенная функция должна будет сделать меньше работы каждый раз, когда она звонила (который может быть важным, если Вы интегрируете ее, что означает, что это будут много раз называть). Кроме того, я избежал любого использования оператора возведения в степень **, который медленнее, чем просто выписывание обработки на квадрат, и поднял деление из внутреннего цикла и заменил его умножением. Я не посмотрел на все при их реализации в Python, но с моего прошлого раза, настроив внутренний цикл для чистой скорости с помощью сырых данных x87 блок, я, кажется, помню, что это добавляет, вычитает или умножается, берут приблизительно 4 цикла ЦП каждый, делит приблизительно 36 и возведение в степень приблизительно 200. Это было парой несколько лет назад, поэтому возьмите те числа с мелкой частицей соли; тем не менее это иллюстрирует их относительную сложность. Также, вычисление exp(x) путем "в лоб" является очень плохая идея; существуют приемы, которые можно взять при записи хорошей реализации exp(x) это делает это значительно быстрее и более точным, чем генерал a**b возведение в степень стиля.

Я никогда не использовал numpy версию пи констант и e; я всегда придерживался простых математических версий модуля. Я не знаю, почему Вы могли бы предпочесть любой.

Я не уверен, для чего Вы идете с quad() звонить. quad(gen_gauss, -inf, inf, (10,2,0)) должен интегрировать повторно нормализованное Гауссово от минус бесконечность к плюс бесконечность и должен всегда выкладывать 10 (Ваш коэффициент нормализации), так как Гауссово интегрируется к 1 по реальной строке. Любой ответ, далекий от 10 (я не ожидал бы точно 10 с тех пор quad() только приближение, в конце концов) означает, что что-то завинчено где-нибудь... трудно для высказывания, что завинчено, не зная фактическое возвращаемое значение и возможно внутренние работы quad().

Надо надеяться, это демистифицировало часть беспорядка и объяснило, почему функция ошибок является правильным решением Вашей проблемы, а также как сделать все это самостоятельно, если Вам любопытно. Если какое-либо мое объяснение не было четким, я предлагаю бросить беглый взгляд на Википедию сначала; если у Вас все еще есть вопросы, спросите.

32
ответ дан 8 December 2019 в 02:05
поделиться

scipy поставлется с "функцией ошибок", иначе Гауссов интеграл:

import scipy.special
help(scipy.special.erf)
13
ответ дан 8 December 2019 в 02:05
поделиться

Я предполагаю, что Вы обрабатываете многомерный Gaussians; если так, SciPy уже имеет функцию, которую Вы ищете: это назвало MVNDIST ("Нормальное распределение MultiVariate). Документация SciPy, как всегда, ужасна, таким образом, я не могу даже найти, где функция прокладывается под землей, но это там где-нибудь. Документация является легко худшей частью SciPy и расстроила меня ни к какому концу в прошлом.

Одно-переменные Gaussians просто используют старую добрую функцию ошибок, которой много реализаций доступны.

Что касается принятия за решение проблемы в целом, да, как James Thompson упоминает, Вы просто хотите записать свою собственную функцию распределения Гаусса и подать его к четверке (). Если можно избежать обобщенной интеграции, тем не менее, это - хорошая идея сделать так - специализированные методы интеграции для конкретной функции (как использование MVNDIST) будут намного быстрее, чем стандартный Монте-Карло многомерная интеграция, которая может быть чрезвычайно медленной для высокой точности.

3
ответ дан 8 December 2019 в 02:05
поделиться

Почему не только всегда делают Вашу интеграцию от - бесконечность к +infinity, так, чтобы Вы всегда знали ответ? (шутка!)

Мое предположение - то, что единственная причина, что уже нет консервированной Гауссовой функции в SciPy, состоит в том, что это - тривиальная функция для записи. Ваше предложение о записи Вашей собственной функции и передаче его к четверке для интеграции превосходных звуков. Это использует принятый инструмент SciPy для того, чтобы сделать это, это - минимальное усилие по коду для Вас, и это очень читаемо для других людей, даже если они никогда не видели SciPy.

Что точно Вы подразумеваете под интегратором фиксированной ширины? Вы означаете использовать другой алгоритм, чем любой QUADPACK использует?

Править: Для полноты вот что-то как то, что я попробовал бы за Гауссово со средним из 0 и стандартным отклонением 1 от 0 до +infinity:

from scipy.integrate import quad
from math import pi, exp
mean = 0
sd   = 1
quad(lambda x: 1 / ( sd * ( 2 * pi ) ** 0.5 ) * exp( x ** 2 / (-2 * sd ** 2) ), 0, inf )

Это немного ужасно, потому что Гауссова функция немного долга, но все еще довольно тривиальна для записи.

2
ответ дан 8 December 2019 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: