Мой вопрос состоит из двух частей: как я могу определить двумерную функцию lognorm, которая принимает позиции x и y и возвращает вывод lognorm. Затем я хочу взять этот результат и использовать его в качестве измерения z на трехмерном графике поверхности. Итак, моя цель - построить двумерное распределение логнорм в виде трехмерного поверхностного графика. Любая помощь очень ценится.
я понимаю, но как я могу использовать это для построения двумерной логнормы? а затем используйте это для 3D-поверхности, большое спасибо за ответ с помощью
GIYF matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-pl ots Предоставляет срез как 3 вектора одинаковой длины, тогда z [i] [j] = f (x [i], y [j])
хорошо, поэтому мои x и y будут выглядеть примерно так: x = np.linspace (-90, 90, 400) и y = np.linspace (-90, 90, 400). Как я могу получить значения z, которые соответствовали бы выходным данным lognorm?
Я должен признать статистическое незнание вашей конкретной проблемы, но из того, что я могу сказать, только lognorm работает со 2-м случаем, поэтому вам нужно сгенерировать поперечные сечения целевой поверхности.
Если вы подробно объясните свою проблему с точки зрения желаемых входных, выходных и промежуточных данных, я мог бы помочь. Если у вас есть чистый код, вы можете опубликовать его, это также будет полезно.
Прошу прощения, это неизведанная территория для меня, но я попробую то, что вы предложили. Я хотел бы получить пример того, как это сделать, если бы вы могли его предоставить, но тем не менее спасибо за вашу помощь
Хорошо, поэтому мои координаты x и y находятся между -90 и 90 по осям x и y. Я хотел бы получить логнормальный ответ с центром в координатах x = 10 и y = 0. Тогда я могу изобразить результат в виде трехмерной поверхности, которая предназначена для представления топографической карты части человеческого мозга. У меня нет большого количества кода для публикации здесь, так как я довольно застрял на этом этапе. Я знаю, как настроить свой график с помощью координат x и y, но я не знаю, как получить соответствующие координаты z нормы журнала. Я использую lognorm из-за сильного хвоста распределения, так как оно достаточно хорошо моделирует часть рецептивного поля мозга.
в качестве отправной точки, я полагаю, мы можем использовать двумерное нормальное распределение, а затем преобразовать его в логнормальное распределение, если бы это имело смысл. большое спасибо за то, что нашли время искренне помочь
Будете ли вы центрировать спад в центре вашей сетки, а затем станете токарным станком? Если это так, вам необходимо преобразовать в полярные координаты. Центр становится исходной точкой для 2D-случая, тогда евклидово расстояние от центра, спроецированного в xy-плоскость, является t-значением, при котором производится выборка логнормы в 2D. Итак, сделайте выборку всего своего линейного пространства, преобразовав каждую точку в соответствующую полярную точку и извлеките указанное выше в z.
хорошо, это имеет смысл, не могли бы вы предоставить образец кода из приведенного выше объяснения? таким образом я могу убедиться, что делаю то, что вы предложили.
Вот в чем суть, я не тестировал, но логика не слишком сложна. его также можно векторизовать для ускорения, но вы должны сопоставить свои линейные пространства в один длинный массив 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? Еще раз большое спасибо за вашу помощь
В соответствии с вызовами, показанными внизу страницы, необходимы два ввода, данные и сигма (stddev), и вы должны решить, как вы хотите их использовать, например, вам нужен pdf или cdf, или, возможно, вы подгоночные данные. Вы должны выбрать конкретный вызов из модуля, например. lognrom.pdf(data,s)
. docs.scipy.org/doc/scipy/reference/generated/…
я понимаю! также является ли норма np простым расчетом расстояния? так что можем мы использовать любой метод для расстояния, например евклидов, поскольку np.norm не является функцией
Вы можете вычислить евклидово расстояние, используя теорему Пифагора о произвольных больших размерностях. Вычитание двух векторов друг из друга дает вектор с центром (0,0), указывающий на a, имеющий величину, эквивалентную расстоянию между a и b, поэтому, если вы запрашиваете норму, она приравнивается к евклидову расстоянию, это хорошее сокращение .
пожалуйста, посмотрите ответ ниже, чтобы узнать, как я это реализовал
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()
Хорошо, вот код, который я написал, и результат наверняка попадает туда, но выглядит немного странно. Я приложил его для вас, пожалуйста, посмотрите, можете ли вы дать какие-либо указания.
Оуиби, пожалуйста, посмотри, когда у тебя будет возможность
Вам не нужно его определять, он предоставляется библиотекой, которую вы используете
from scipy.stats import lognorm
.