Есть ли легкодоступная реализация erf () для Python?

Я могу реализовать функцию ошибок, erf, сам, но я бы предпочел этого не делать. Есть ли пакет python без внешних зависимостей, содержащий реализацию этой функции? Я нашел это, но, похоже, это часть какого-то гораздо большего пакета (и даже не ясно, какой из них!).

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
57
0
60 629
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Я бы порекомендовал вам загрузить тупой (чтобы иметь эффективную матрицу в python) и странный (заменитель набора инструментов Matlab, который использует numpy). Функция erf лежит в scipy.

>>>from scipy.special import erf
>>>help(erf)

Вы также можете использовать функцию erf, определенную в pylab, но она больше предназначена для построения графиков результатов вычислений с помощью numpy и scipy. Если вам нужен моноблок Для установки этого программного обеспечения вы можете использовать непосредственно Распределение Python Enthought.

SciPy - это материнская загрузка числового программного обеспечения для Python. Но начать использовать его может быть немного сложно. Начните с просмотра scipy.org

John D. Cook 19.01.2009 16:06

Я должен сказать, что мне его совершенно не удалось установить. Я не зря попросил пакет без внешних зависимостей. Numpy - не единственный. UMFPack - другое. Так будет проще написать свой собственный erf ()!

rog 19.01.2009 16:35

попробуйте Python Enthought, как я уже упоминал, они собрали все, что вам нужно.

Mapad 19.01.2009 16:51

363 МБ загруженной лицензией загрузки - это больше, чем я готов для 30-строчной функции ... как оказалось, Macports действительно скупы. Пока я говорю, он полностью перекомпилирует gcc. Здесь что-то не так!

rog 19.01.2009 17:45

Пример должен читать «import scipy.special as erf», т.е. избавиться от первого «erf» и оставить второй. Поскольку erf - это функция, а не модуль, он не должен быть частью пути импорта. "import scipy.special as foobar" тоже подойдет. «Как» - это удобство.

John D. Cook 20.01.2009 23:07

Было бы менее запутанно использовать "from scipy.special import erf", поскольку он импортирует только функцию erf.

Lanny 27.11.2010 16:20

Я рекомендую SciPy для числовых функций в Python, но если вам нужно что-то без зависимостей, вот функция с ошибкой, которая меньше 1,5 * 10-7 для всех входов.

def erf(x):
    # save the sign of x
    sign = 1 if x >= 0 else -1
    x = abs(x)

    # constants
    a1 =  0.254829592
    a2 = -0.284496736
    a3 =  1.421413741
    a4 = -1.453152027
    a5 =  1.061405429
    p  =  0.3275911

    # A&S formula 7.1.26
    t = 1.0/(1.0 + p*x)
    y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*math.exp(-x*x)
    return sign*y # erf(-x) = -erf(x)

Алгоритм взят из Справочник по математическим функциям, формула 7.1.26.

Ты прав. Я отредактировал свой ответ, чтобы найти для знака x другой способ решения этой проблемы. Сейчас все в порядке.

John D. Cook 19.01.2009 19:01

из википедии: «Справочник - это работа [сотрудников] федерального правительства США, не защищенная авторским правом». Ставлю сюда более прямую ссылку на книгу: math.sfu.ca/~cbm/aands/frameindex.htm

mariotomo 13.11.2009 10:56

Я пытаюсь использовать эту функцию, но безуспешно передаю массив numpy в x и возвращаю массив numy в качестве ответа. Можете ли вы переписать массивную версию функции?

Bob 10.08.2018 06:51

Чтобы ответить на свой вопрос, я использовал следующий код, адаптированный из версии Java, которую я нашел в другом месте в Интернете:

# from: http://www.cs.princeton.edu/introcs/21function/ErrorFunction.java.html
# Implements the Gauss error function.
#   erf(z) = 2 / sqrt(pi) * integral(exp(-t*t), t = 0..z)
#
# fractional error in math formula less than 1.2 * 10 ^ -7.
# although subject to catastrophic cancellation when z in very close to 0
# from Chebyshev fitting formula for erf(z) from Numerical Recipes, 6.2
def erf(z):
    t = 1.0 / (1.0 + 0.5 * abs(z))
        # use Horner's method
        ans = 1 - t * math.exp( -z*z -  1.26551223 +
                            t * ( 1.00002368 +
                            t * ( 0.37409196 + 
                            t * ( 0.09678418 + 
                            t * (-0.18628806 + 
                            t * ( 0.27886807 + 
                            t * (-1.13520398 + 
                            t * ( 1.48851587 + 
                            t * (-0.82215223 + 
                            t * ( 0.17087277))))))))))
        if z >= 0.0:
            return ans
        else:
            return -ans

Хорошо, но начиная с 2.7 мы должны делать from math import erf (для портативности, точности, скорости и т. д.)

smci 21.05.2013 03:54

Реализацию на чистом Python можно найти в модуле mpmath (http://code.google.com/p/mpmath/)

Из строки документа:

>>> from mpmath import *
>>> mp.dps = 15
>>> print erf(0)
0.0
>>> print erf(1)
0.842700792949715
>>> print erf(-1)
-0.842700792949715
>>> print erf(inf)
1.0
>>> print erf(-inf)
-1.0

Для большого реального x, \mathrm{erf}(x) приближается к 1 очень быстро::

>>> print erf(3)
0.999977909503001
>>> print erf(5)
0.999999999998463

Функция ошибки - это нечетная функция:

>>> nprint(chop(taylor(erf, 0, 5)))
[0.0, 1.12838, 0.0, -0.376126, 0.0, 0.112838]

: func: erf реализует вычисление произвольной точности и поддерживает комплексные числа:

>>> mp.dps = 50
>>> print erf(0.5)
0.52049987781304653768274665389196452873645157575796
>>> mp.dps = 25
>>> print erf(1+j)
(1.316151281697947644880271 + 0.1904534692378346862841089j)

Связанные функции

См. Также: func: erfc, что более точно для больших x, и: func: erfi, который дает первообразную \exp(t^2).

Интегралы Френеля: func: fresnels и: func: fresnelc также связаны с функцией ошибок.

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

rog 22.01.2009 20:28

У меня есть функция, которая выполняет 10 ^ 5 вызовов erf. На моей машине ...

scipy.special.erf делает это время за 6,1 с.

Справочник по математическим функциям erf занимает 8,3 с.

erf Numerical Recipes 6.2 занимает 9,5 с

(трехкратные средние значения, код взят с вышеперечисленных плакатов).

erf, вызываемый ctypes из libm.so (стандартная математическая библиотека c, здесь 64-битная Linux), снижается до 5,6 с.

meteore 26.10.2010 18:44

Мне также нужны 1000 вызовов erf. Основываясь на ваших цифрах, я выберу scipy.special.erf. С тех пор вы нашли что-нибудь более быстрое? Я подумал об использовании поиска ..

jtlz2 14.08.2013 17:47

FWIW, как вы используете функцию scipy erf? При следующей настройке: from scipy.special import erf; import numpy as np; data = np.random.randn(10e5), я получаю очень быстрое время работы от: result = erf(data). В частности, в этом случае я получаю 32 мс на цикл. Единственный способ получить время выполнения> 1 с - это наивно перебрать все элементы в массиве numpy.

8one6 04.03.2014 20:15
Ответ принят как подходящий

Начиная с версии 2.7. стандартный модуль математика содержит функцию эрф. Это должен быть самый простой способ.

http://docs.python.org/2/library/math.html#math.erf

Есть ли модуль Python, который предоставляет erf⁻¹ (x)?

Lori 02.02.2015 01:49

@ Лори - да, math.erfc

Matthew 02.12.2017 17:43

@Matthew Я не думаю, что это правильно, согласно документации. Это вычисляет 1.0 - erf (x). Обратный к erf () есть в SciPy: stackoverflow.com/questions/31266249/…

tmn 26.10.2019 20:45

Одно замечание для тех, кто стремится к более высокой производительности: векторизуйте, если это возможно.

import numpy as np
from scipy.special import erf

def vectorized(n):
    x = np.random.randn(n)
    return erf(x)

def loopstyle(n):
    x = np.random.randn(n)
    return [erf(v) for v in x]

%timeit vectorized(10e5)
%timeit loopstyle(10e5)

дает результаты

# vectorized
10 loops, best of 3: 108 ms per loop

# loops
1 loops, best of 3: 2.34 s per loop

SciPy имеет реализацию функции erf, см. scipy.special.erf.

Другие вопросы по теме