У меня есть набор данных, содержащий около 10 непрерывных функций и 1000 двоичных (категориальных) функций. После масштабирования и нормализации данных так, чтобы каждая функция имела среднее значение 0,0, я выполняю PCA для данных, чтобы получить уменьшенную матрицу z, сохраняя около 90% дисперсии (сохраняя ~ 700 основных компонентов).
Если теперь я хочу подобрать нормальное распределение для данных, у меня есть код ниже
import numpy as np
from scipy.stats import multivariate_normal
mean = np.mean(z, axis=0)
cov = np.cov(z, rowvar=0)
g = multivariate_normal(mean=mean, cov=cov)
# put a random sample of z through the pdf
# to check the probability of the sample occurring
print(g.pdf(z[np.random.randint(z.shape[0]),:]))
>>> 0.0
Проблема в том, что независимо от того, сколько раз я запускаю print(g.pdf(z[np.random.randint(z.shape[0]),:])), я получаю 0,0. Я ценю, что некоторые образцы в z будут лежать дальше от среднего, чем в среднем, что даст мне и ответ, близкий к 0,0. Но я бы подумал, что по крайней мере некоторые образцы в z будут ближе к среднему и, следовательно, дадут мне гораздо больший ответ, когда я введу случайное значение z в pdf.
Это может быть связано с моими исходными данными или сокращенным набором данных z и тем, как они распределяются. Но я выполнил несколько проверок как исходного набора данных, так и z, чтобы убедиться, что нет значений nan, гарантируя, что среднее значение каждого столбца z на самом деле равно 0,0 и т. д.
Мои результаты показывают, что у меня гауссиан с очень тонкими хвостами (очень узкий гауссиан), так что все далеко от пика. Я не думаю, что так должно быть.
Правильно ли я использую multivariate_normal? Могу ли я выполнить какие-либо другие проверки данных или иным образом? Я знаю, что делаю большое предположение, что данные распределяются нормально, но, конечно же, не все значения в z должны давать значение pdf 0,0.
Слишком много слов KillerT. Сократите длину до одного абзаца. У вас две проблемы: 1. Правильно ли вы используете его функции. 2. Верно ли ваше модельное предположение. Похоже, вы нормально используете функции. Может быть, распечатать несколько верхних максимальных / минимальных значений ковариации и среднего? Вы можете получить действительно резкую кривизну в сильно затемненном пространстве. Почему бы не перебрать весь z-вектор и посмотреть, все ли они равны 0,0?






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