Написание кода на Python для нескольких гауссовских функций - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь написать код на Python, который создаст графики для нескольких идентичных гауссовских функций. В онлайн графическом калькуляторе это выглядит так:

desired output

Но при попытке сделать это, используя numpy и matplotlib, я получаю следующее:

problematic plot in python

Что я делаю не так? Вот мой код:

import numpy as np
import matplotlib.pyplot as plt

b = 10 ** 6
L = 50
N = 5
sigma = np.power(10, 3)

x = np.linspace(0, L, 1000)

def gaussian(x, dk, sigma):
    return np.exp(-np.power((x - dk) / sigma, 2.) / 2.)

y = 6 * gaussian(np.linspace(0, L, 1000), L / 4., np.power(10., -2.)) + 6 * gaussian(np.linspace(0, L, 1000), L / 2., np.power(10., -2.)) + 6 * gaussian(np.linspace(0, L, 1000), .75 * L, np.power(10., -2.))

plt.plot(x, y)
plt.show()

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

У вас есть опечатка в гауссовской функции, которая не совпадает с упомянутой выборкой.Но это не обязательно говорить как «неправильный», поскольку он просто влияет на значение стандартного отклонения.

Вместо np.exp(-np.power((x-dk)/sigma,2.) / 2.), оно должно быть

np.exp(-np.power((x-dk),2.) /( sigma / 2.))

Редактировать : И сигма должна быть 10 ^ -3, чтобы воспроизвести предоставленный образец.Но сейчас я просто использую 10 ^ -2, так как небольшое отклонение делает вещи слишком чувствительными.

Сигма будет настолько мала, что функция Гаусса будет настолько чувствительна к размеру выборки.

Но исправление этого не даст вам желаемого результата, вы заметите, что ниже 1000,средняя полоса еще немного ниже.

Gauss_3

Почему?

Во-первых, вы должны заметить:

Функция Гаусса не предназначена для генерации пошаговой функции в основном назначении.

Давайте рассмотрим более подробный пример о выборке, она немного связана со статистикой.


N = 100

for i in range(50):
    y += 6*gaussian(x, i, np.power(10.,-3.)) 

n_100

Что происходит с этим графиком?Почему в середине есть падение?

Причина в том, что функция Гаусса является приближением вероятности.Допустим, что человек был уничтожен новым гриппом.Только 100 человек выживают, хорошо, теперь мы выбираем 50 человек и проверяем, сколько людей заражено (1 из них заражен).

Итак, какова вероятность выбора 50 человек из 50 и как мы можем позвонить, чтобы сказать, что в одной группе кто-то склонился?

Ответ:1, наверняка вы выбрали все 50, некоторые из них должны быть отклонены

Так какова вероятность выбора 25 человек из 50 и как мы можем позвонить, сказать, что есть одна группа?кто-то задумался?

Ответ: 1 / nCr (50,25) ~ = 0

Кстати, на этот раз гауссовская функция не очень хорошаяприближение как для низкого размера выборки.(Из-за центральной теоремы о пределе, wiki )


N = 10000

Я уменьшил некоторую точку выборки, чтобы сэкономить время, поэтому

for i in range(0, 10000, 100):
    y += 6*gaussian(x, i, np.power(10.,-3.)) 

Gauss_2

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


Для 100 выборокразница в вероятности выбора еще одного человека для подсчета огромна.

49 из 50, и 48 из 50 имеют большое значение, так как в целом в пуле всего 100 человек.

Нодля 10000, 49 из 50 и 48 из 50, кого это волнует?Они почти такие же из этого огромного пула.Вот почему вы можете сделать три столбца одинаковой высоты .

PS. Я упоминаю в основном идею центральной предельной теоремы: почему при большом пуле размер выборки не будет большимразница в том, чтобы говорить правду, и поэтому мы можем сделать «выборку», чтобы представить весь пул.

0 голосов
/ 09 сентября 2018

То, что вы наблюдаете, является артефактом выборки. Давайте введем параметр с именем n_sample. Этот параметр дает нам количество точек, по которым функция оценивается в заданном интервале.

import numpy as np
import matplotlib.pyplot as plt
def gaussian(x,dk,sigma):
    return np.exp(-np.power((x-dk)/sigma,2.) / 2.)

L=50
n_sample=10000
x = np.linspace(0,L,n_sample)
y = 6*gaussian(np.linspace(0,L,n_sample),L/4., np.power(10.,-2.)) + 6*gaussian(np.linspace(0,L,n_sample), L/2., np.power(10.,-2.)) +  6*gaussian(np.linspace(0,L,n_sample), .75*L, np.power(10.,-2.))

plt.plot(x,y)
plt.title("n_sample={}".format(n_sample))
plt.show()

Я изобразил ваши функции с различными значениями для n_sample. Вы видите, что если вы увеличите n_sample до достаточно большого значения, вы получите правильное представление ваших данных.

с 10k образцов: 10k

С 1000 образцов: 1000

Только с 100 образцами. Обратите внимание на изменения в шкале y: 100

...