Как преобразовать двумерное нормальное распределение в двумерное логнормальное распределение в Python

Мой вопрос состоит из двух частей: как я могу определить двумерную функцию lognorm, которая принимает позиции x и y и возвращает вывод lognorm. Затем я хочу взять этот результат и использовать его в качестве измерения z на трехмерном графике поверхности. Итак, моя цель - построить двумерное распределение логнорм в виде трехмерного поверхностного графика. Любая помощь очень ценится.

Вам не нужно его определять, он предоставляется библиотекой, которую вы используете from scipy.stats import lognorm.

awiebe 25.10.2018 05:11

я понимаю, но как я могу использовать это для построения двумерной логнормы? а затем используйте это для 3D-поверхности, большое спасибо за ответ с помощью

eddie long 25.10.2018 05:14

GIYF matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-pl‌ ots Предоставляет срез как 3 вектора одинаковой длины, тогда z [i] [j] = f (x [i], y [j])

awiebe 25.10.2018 05:18

хорошо, поэтому мои x и y будут выглядеть примерно так: x = np.linspace (-90, 90, 400) и y = np.linspace (-90, 90, 400). Как я могу получить значения z, которые соответствовали бы выходным данным lognorm?

eddie long 25.10.2018 05:19

Я должен признать статистическое незнание вашей конкретной проблемы, но из того, что я могу сказать, только lognorm работает со 2-м случаем, поэтому вам нужно сгенерировать поперечные сечения целевой поверхности.

awiebe 25.10.2018 05:29

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

awiebe 25.10.2018 05:30

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

eddie long 25.10.2018 05:31

Хорошо, поэтому мои координаты x и y находятся между -90 и 90 по осям x и y. Я хотел бы получить логнормальный ответ с центром в координатах x = 10 и y = 0. Тогда я могу изобразить результат в виде трехмерной поверхности, которая предназначена для представления топографической карты части человеческого мозга. У меня нет большого количества кода для публикации здесь, так как я довольно застрял на этом этапе. Я знаю, как настроить свой график с помощью координат x и y, но я не знаю, как получить соответствующие координаты z нормы журнала. Я использую lognorm из-за сильного хвоста распределения, так как оно достаточно хорошо моделирует часть рецептивного поля мозга.

eddie long 25.10.2018 05:34

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

eddie long 25.10.2018 05:40

Будете ли вы центрировать спад в центре вашей сетки, а затем станете токарным станком? Если это так, вам необходимо преобразовать в полярные координаты. Центр становится исходной точкой для 2D-случая, тогда евклидово расстояние от центра, спроецированного в xy-плоскость, является t-значением, при котором производится выборка логнормы в 2D. Итак, сделайте выборку всего своего линейного пространства, преобразовав каждую точку в соответствующую полярную точку и извлеките указанное выше в z.

awiebe 25.10.2018 05:43

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

eddie long 25.10.2018 05:46
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
11
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот в чем суть, я не тестировал, но логика не слишком сложна. его также можно векторизовать для ускорения, но вы должны сопоставить свои линейные пространства в один длинный массив 2D-векторов.

dx = xMax - xMin
dy = yMax - yMin
c= (dx+dx/2.0,dy+dy/2.0)
z=np.array(shape=(N,M))
#Lets use a cartersian input vector space instead of polar
for i in range(len(xlinspace)):
    for j in range(len(ylinspace)):
        p=(xlinspace[i],ylinspace[j])
        d= np.norm(p-c) # produce a distance form the centre for the smapled point
        t=d #I'm just renaming distance to t to make it clear, this is an extra step as far as the program is concerned.
        #Now put your lognorm logic here, i'll use f as a placeholder function
        z[i][j]=f(t)
#You now have a 2d array of z outputs

Большое спасибо, я обязательно буду использовать это как основу, последний вопрос, для логики lognorm я могу просто использовать функцию scipy lognorm и ввести в нее правильные значения t? Еще раз большое спасибо за вашу помощь

eddie long 25.10.2018 06:05

В соответствии с вызовами, показанными внизу страницы, необходимы два ввода, данные и сигма (stddev), и вы должны решить, как вы хотите их использовать, например, вам нужен pdf или cdf, или, возможно, вы подгоночные данные. Вы должны выбрать конкретный вызов из модуля, например. lognrom.pdf(data,s). docs.scipy.org/doc/scipy/reference/generated/…

awiebe 25.10.2018 06:11

я понимаю! также является ли норма np простым расчетом расстояния? так что можем мы использовать любой метод для расстояния, например евклидов, поскольку np.norm не является функцией

eddie long 25.10.2018 06:14

Вы можете вычислить евклидово расстояние, используя теорему Пифагора о произвольных больших размерностях. Вычитание двух векторов друг из друга дает вектор с центром (0,0), указывающий на a, имеющий величину, эквивалентную расстоянию между a и b, поэтому, если вы запрашиваете норму, она приравнивается к евклидову расстоянию, это хорошее сокращение .

awiebe 25.10.2018 06:18

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

eddie long 25.10.2018 06:32
dx = 90 - (-90)
dy = 90 - (-90)
c = [dx + dx/2.0, dy+dy/2.0]
z = np.zeros((400, 400))
x = np.linspace(-90, 90, 400)
y = x.copy()
for i in range(len(x)):
    for j in range(len(y)):
        p =[x[i], y[j]]
        d = math.sqrt((p[0]-c[0])**2 + (p[1]-c[1])**2)
        t = d

        z[i][j] = lognorm.pdf(t, 1.2)




fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.plot_surface(x,y, z, cmap = 'viridis')



plt.show()

Хорошо, вот код, который я написал, и результат наверняка попадает туда, но выглядит немного странно. Я приложил его для вас, пожалуйста, посмотрите, можете ли вы дать какие-либо указания.

Оуиби, пожалуйста, посмотри, когда у тебя будет возможность

eddie long 25.10.2018 06:29

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