Как узнать, правильно ли я подбираю нормальное распределение к данным с помощью Scipy?

У меня есть набор данных, содержащий около 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.

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

Warren Weckesser 20.03.2018 21:25

Слишком много слов KillerT. Сократите длину до одного абзаца. У вас две проблемы: 1. Правильно ли вы используете его функции. 2. Верно ли ваше модельное предположение. Похоже, вы нормально используете функции. Может быть, распечатать несколько верхних максимальных / минимальных значений ковариации и среднего? Вы можете получить действительно резкую кривизну в сильно затемненном пространстве. Почему бы не перебрать весь z-вектор и посмотреть, все ли они равны 0,0?

Alexander McFarlane 22.03.2018 02:02
Почему в 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
2
53
0

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