Я пытаюсь установить то, что люди в общих чертах назвали бы самодельным KDE - я полагаю. Я пытаюсь оценить плотность довольно большого набора точек данных. В частности, имея много точек данных для разброса, я хочу указать плотность с помощью цветового градиента (см. ссылку ниже).
Для примера я привожу случайную пару данных (x, y) ниже. Реальные данные будут распределены в разных масштабах, отсюда и разница в расстоянии между точками сетки по осям X и Y.
import numpy as np
from matplotlib import pyplot as plt
def homemadeKDE(x, xgrid, y, ygrid, sigmaX = 1, sigmaY = 1):
a = np.exp( -((xgrid[:,None]-x)/(2*sigmaX))**2 )
b = np.exp( -((ygrid[:,None]-y)/(2*sigmaY))**2 )
xweights = np.dot(a, x.T)/np.sum(a)
yweights = np.dot(b, y.T)/np.sum(b)
return xweights, yweights
x = np.random.rand(10000)
x.sort()
y = np.random.rand(10000)
xGrid = np.linspace(0, 500, 501)
yGrid = np.linspace(0, 10, 11)
newX, newY = homemadeKDE(x, xGrid, y, yGrid)
Я застрял в том, как спроецировать эти значения обратно в исходный вектор x и y, чтобы я мог использовать его для построения двумерного графика рассеяния (x, y) со значением z для плотности, окрашенной заданной цветовой картой, например так :
plt.scatter(x, y, c = z, cmap = "jet")
Подход к построению графиков и KDE на самом деле вдохновлен этим замечательным ответом.
РЕДАКТИРОВАТЬ 1 Чтобы сгладить некоторую путаницу, идея состоит в том, чтобы сделать гауссовский KDE, который был бы на гораздо более грубой сетке. SigmaX и sigmaY отражают пропускную способность ядра в направлениях x и y соответственно.
X
? И последнее, но не менее важное: какова цель этой функции? - person ImportanceOfBeingErnest   schedule 23.03.2018x
? - person ImportanceOfBeingErnest   schedule 23.03.2018z
в вашем случае? Как вы хотите, чтобы ваши данныеx,y
были точно окрашены? - person Gabriel   schedule 23.03.2018scipy.stats.gaussian_kde()
возвращает одно значение (KDE) для каждой парыx,y
, а ваша функцияhomemadeKDE()
возвращает два. Тогда мне непонятно, что будет эквивалентно значению KDE в вашем случае (то есть:z
на диаграмме рассеяния) - person Gabriel   schedule 23.03.2018np.dot()
для умножения весов, но тогда вектор все равно меньше исходного, что очевидно из-за того, что моих точек сетки меньше, чем точек данных. - person Fourier   schedule 23.03.2018scipy.stats.gaussian_kde()
? - person Gabriel   schedule 23.03.2018