Рассчитайте, как значение отличается от среднего значения, используя плотность ядра по Гауссу (Python)

Я использую этот код для расчета плотности ядра по Гауссу для этих значений.

from random import randint
x_grid=[]
for i in range(1000):
    x_grid.append(randint(0,4))
print (x_grid)

Это код для расчета плотности ядра по Гауссу.

from statsmodels.nonparametric.kde import KDEUnivariate
import matplotlib.pyplot as plt

def kde_statsmodels_u(x, x_grid, bandwidth=0.2, **kwargs):
    """Univariate Kernel Density Estimation with Statsmodels"""
    kde = KDEUnivariate(x)
    kde.fit(bw=bandwidth, **kwargs)
    return kde.evaluate(x_grid)

import numpy as np
from scipy.stats.distributions import norm

# The grid we'll use for plotting
from random import randint
x_grid=[]
for i in range(1000):
    x_grid.append(randint(0,4))
print (x_grid)

# Draw points from a bimodal distribution in 1D
np.random.seed(0)
x = np.concatenate([norm(-1, 1.).rvs(400),
                    norm(1, 0.3).rvs(100)])

pdf_true = (0.8 * norm(-1, 1).pdf(x_grid) +
            0.2 * norm(1, 0.3).pdf(x_grid))

# Plot the three kernel density estimates
fig, ax = plt.subplots(1, 2, sharey=True, figsize=(13, 8))
fig.subplots_adjust(wspace=0)

pdf=kde_statsmodels_u(x, x_grid, bandwidth=0.2)
ax[0].plot(x_grid, pdf, color='blue', alpha=0.5, lw=3)
ax[0].fill(x_grid, pdf_true, ec='gray', fc='gray', alpha=0.4)
ax[0].set_title("kde_statsmodels_u")
ax[0].set_xlim(-4.5, 3.5)

plt.show()

Все значения в сетке находятся в диапазоне от 0 до 4. Если я получаю новое значение 5, я хочу рассчитать, как это значение отличается от средних значений, и присвоить ему оценку от 0 до 1. (установка порога)

Поэтому, если я получаю в качестве нового значения 5, его оценка должна быть близка к 0,90, а если я получаю в качестве нового значения 500, его оценка должна быть близка к 0,0.

Как я могу это сделать? Является ли моя функция для расчета плотности ядра Гаусса правильной или есть лучший способ/библиотека для этого?

* ОБНОВЛЕНИЕ * Я прочитал пример в статье. Вес стиральной машины обычно составляет 100 кг. Обычно продавцы используют единицу кг для обозначения его вместимости (например, 9 кг). Для человека нетрудно понять, что 9 гк — это вместимость, а не общий вес стиральной машины. Мы можем «подделать» эту форму интеллекта без глубокого понимания языка, вместо этого моделируя распределение значений по обучающим данным для каждого атрибута.

Для данного атрибута а (например, веса стиральной машины) пусть Va = {va1, va2, . . . van} (|Va| = n) — набор значений атрибута a, соответствующих продуктам в обучающих данных. Если бы я нашел новое значение v. Интуитивно оно «близко» к (распределению, полученному из) Va, тогда мы должны чувствовать себя более уверенно, присваивая это значение a (пример весу стиральной машины).

Идея может состоять в том, чтобы измерить количество стандартных отклонений, на которое новое значение v отличается от среднего значения в Va, но лучше было бы смоделировать (гауссову) ядерную плотность на Va, а затем выразить поддержку при новом значении v как плотность в этой точке:

введите здесь описание изображения

где σ^(2)ak — дисперсия k-го гауссиана, а Z — константа, обеспечивающая S(c.s.v, Va) ∈ [0, 1]. Как я могу получить его в Python, используя библиотеку statsmodels?

* ОБНОВЛЕНО 2 * Пример данных... но я думаю, что это не очень важно... Генерируется этим кодом...

from random import randint
x_grid=[]
for i in range(1000):
    x_grid.append(randint(1,3))
print (x_grid)

[2, 2, 1, 2, 2, 3, 1, 1, 1, 2, 2, 2, 1, 1, 3, 3, 1, 2, 1, 3, 2, 3, 3, 1, 2, 3, 1, 1, 3, 2, 2, 1, 1, 1, 2, 3, 2, 1, 2, 3, 3, 2, 2, 3, 3, 2, 2, 1, 2, 1, 2, 2, 3, 3, 1, 1, 2, 3, 3, 2, 1, 2, 3, 3, 3, 3, 2, 1, 3, 2, 2, 1, 3, 3, 1, 2, 1, 3, 2, 3, 3, 1, 2, 3, 3, 2, 1, 2, 3, 2, 1, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 3, 2, 3, 3, 1, 1, 3, 2, 1, 1, 3, 3, 3, 2, 1, 2, 2, 1, 3, 2, 3, 1, 3, 1, 2, 3, 1, 3, 2, 2, 1, 1, 2, 2, 3, 1, 1, 3, 2, 2, 1, 2, 1, 2, 3, 1, 3, 3, 1, 2, 1, 2, 1, 3, 1, 3, 3, 2, 1, 1, 3, 2, 2, 2, 3, 2, 1, 3, 2, 1, 1, 3, 3, 3, 2, 1, 1, 3, 2, 1, 2, 2, 2, 1, 3, 1, 3, 2, 3, 1, 2, 1, 1, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 3, 1, 1, 2, 2, 1, 1, 1, 3, 3, 3, 3, 1, 3, 1, 3, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 3, 1, 2, 3, 1, 3, 2, 2, 2, 2, 2, 1, 1, 2, 3, 1, 1, 1, 3, 1, 3, 2, 2, 3, 1, 3, 3, 2, 2, 3, 2, 1, 2, 1, 1, 1, 2, 2, 3, 2, 1, 1, 3, 1, 2, 1, 3, 3, 3, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 3, 1, 3, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 3, 2, 3, 2, 1, 3, 3, 3, 3, 3, 1, 2, 2, 2, 1, 1, 3, 2, 3, 1, 2, 3, 2, 3, 2, 1, 1, 3, 3, 1, 1, 2, 3, 2, 3, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 2, 3, 2, 3, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 2, 3, 1, 2, 1, 3, 3, 2, 2, 3, 3, 3, 2, 1, 1, 2, 2, 3, 2, 3, 2, 1, 1, 1, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, 3, 1, 2, 1, 1, 2, 3, 3, 1, 1, 3, 2, 1, 3, 3, 2, 1, 1, 3, 1, 3, 1, 2, 2, 1, 3, 3, 2, 3, 1, 1, 3, 1, 2, 2, 1, 3, 2, 3, 1, 1, 3, 1, 3, 1, 2, 1, 3, 2, 2, 2, 2, 1, 3, 2, 1, 3, 3, 2, 3, 2, 1, 3, 1, 2, 1, 2, 3, 2, 3, 2, 3, 3, 2, 3, 3, 1, 1, 3, 2, 3, 2, 2, 2, 3, 1, 3, 2, 2, 3, 3, 2, 3, 2, 2, 2, 3, 3, 1, 3, 2, 3, 1, 1, 2, 1, 3, 1, 2, 2, 3, 3, 1, 3, 1, 1, 2, 2, 1, 3, 3, 3, 1, 2, 2, 2, 1, 3, 1, 2, 2, 2, 3, 3, 3, 1, 1, 2, 3, 3, 1, 1, 2, 3, 2, 3, 3, 2, 2, 1, 3, 3, 3, 3, 2, 3, 1, 3, 3, 2, 1, 3, 2, 1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 2, 3, 3, 3, 2, 1, 3, 1, 1, 1, 1, 3, 1, 2, 3, 3, 3, 2, 3, 1, 2, 2, 2, 3, 2, 1, 2, 3, 3, 2, 3, 3, 1, 2, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1, 1, 2, 3, 1, 3, 3, 2, 1, 3, 3, 3, 2, 2, 1, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 1, 2, 1, 1, 3, 3, 3, 2, 2, 3, 1, 3, 2, 1, 3, 1, 1, 3, 3, 1, 2, 2, 2, 3, 3, 1, 2, 1, 2, 1, 3, 2, 3, 3, 3, 3, 3, 3, 3, 1, 2, 3, 1, 3, 3, 2, 2, 1, 3, 1, 1, 3, 2, 1, 2, 3, 2, 1, 3, 3, 3, 2, 3, 1, 2, 3, 3, 1, 2, 2, 2, 3, 1, 2, 1, 1, 1, 3, 1, 3, 1, 3, 3, 2, 3, 1, 3, 2, 3, 3, 1, 2, 1, 3, 2, 2, 2, 2, 2, 2, 1, 2, 2, 3, 2, 2, 3, 2, 2, 2, 3, 1, 1, 3, 3, 1, 3, 1, 2, 1, 2, 1, 3, 2, 2, 1, 3, 1, 3, 3, 1, 3, 1, 1, 1, 1, 3, 2, 1, 2, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 3, 1, 1, 3, 1, 3, 2, 2, 2, 1, 1, 2, 3, 3, 2, 3, 3, 1, 2, 3, 2, 2, 3, 1, 2, 2, 2, 1, 1, 3, 1, 2, 2, 2, 1, 1, 2, 3, 1, 3, 1, 1, 3, 2, 2, 3, 2, 2, 3, 3, 1, 1, 2, 2, 3, 1, 1, 2, 3, 2, 2, 3, 1, 2, 2, 1, 1, 3, 2, 3, 1, 1, 3, 1, 3, 2, 3, 3, 3, 3, 3, 2, 2, 3, 2, 1, 1, 1, 3, 3, 1, 2, 1, 3, 2, 3, 2, 2, 1, 2, 3, 3, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 3, 1, 3, 1, 3, 2, 3, 1, 3, 3, 3, 1, 1, 2, 2, 3, 2, 3, 2, 2, 1, 2, 1, 2, 1, 2, 2, 3, 1, 1, 3, 2, 2, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 2, 3, 1, 2, 2, 1, 1, 2, 3, 3, 1, 3, 3, 1, 3, 3, 1, 3, 2, 2, 2, 1, 1, 2, 1, 3, 1, 1, 1, 2, 3, 3, 2, 3, 1, 3]

Этот массив представляет собой оперативную память новых смартфонов на рынке. Обычно они имеют 1,2,3 ГБ оперативной памяти.

Это плотность ядра

введите здесь описание изображения

*** ОБНОВИТЬ

Я пробую код с этими значениями

[1024, 1, 1024, 1000, 1024, 128, 1536, 16, 192, 2048, 2000, 2048, 24, 250, 256, 278, 288, 290, 3072, 3, 3000, 3072, 32, 384, 4096, 4, 4096, 448, 45, 512, 576, 64, 768, 8, 96]

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

      100%      cdfv      kdev
1       42  0.210097  0.499734
1024    96  0.479597  0.499983
5000     0  0.000359  0.498885
2048    36  0.181609  0.499700
3048     8  0.040299  0.499424

* ОБНОВЛЕНИЕ 3 *

[256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 512, 512, 512, 256, 256, 256, 512, 512, 512, 128, 128, 128, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 2048, 2048, 2048, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 128, 128, 128, 512, 512, 512, 256, 256, 256, 256, 256, 256, 1024, 1024, 1024, 512, 512, 512, 128, 128, 128, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 4, 4, 4, 3, 3, 3, 24, 24, 24, 8, 8, 8, 16, 16, 16, 16, 16, 16, 256, 256, 256, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 512, 512, 512, 512, 512, 512, 256, 256, 256, 256, 256, 256, 256, 256, 256, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 2048, 2048, 2048, 2048, 2048, 2048, 4096, 4096, 4096, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 768, 768, 768, 768, 768, 768, 2048, 2048, 2048, 2048, 2048, 2048, 3072, 3072, 3072, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 1024, 1024, 1024, 512, 512, 512, 256, 256, 256, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 3072, 3072, 3072, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 512, 512, 512, 256, 256, 256, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 512, 512, 512, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 64, 64, 64, 1024, 1024, 1024, 1024, 1024, 1024, 256, 256, 256, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 64, 64, 64, 64, 64, 64, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 128, 128, 576, 576, 576, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 576, 576, 576, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 512, 512, 512, 2048, 2048, 2048, 768, 768, 768, 768, 768, 768, 768, 768, 768, 512, 512, 512, 192, 192, 192, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 384, 384, 384, 448, 448, 448, 576, 576, 576, 384, 384, 384, 288, 288, 288, 768, 768, 768, 384, 384, 384, 288, 288, 288, 64, 64, 64, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 3072, 3072, 3072, 2048, 2048, 2048, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 64, 64, 64, 128, 128, 128, 128, 128, 128, 128, 128, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 256, 256, 256, 768, 768, 768, 768, 768, 768, 768, 768, 768, 256, 256, 256, 192, 192, 192, 256, 256, 256, 64, 64, 64, 256, 256, 256, 192, 192, 192, 128, 128, 128, 256, 256, 256, 192, 192, 192, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 128, 128, 128, 128, 128, 128, 384, 384, 384, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 3072, 3072, 3072, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 3072, 3072, 3072, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 32, 32, 32, 768, 768, 768, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 3072, 3072, 3072, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 512, 512, 512, 512, 512, 512, 256, 256, 256, 512, 512, 512, 512, 512, 512, 512, 512, 512, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 128, 128, 128, 128, 128, 1024, 1024, 1024, 1024, 1024, 1024, 128, 128, 128, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 3072, 3072, 3072, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 256, 256, 256, 256, 256, 256, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 3072, 3072, 3072, 2048, 2048, 2048, 384, 384, 384, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 128, 128, 128, 256, 256, 256, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 768, 768, 768, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 128, 128, 128, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 64, 64, 64, 64, 64, 64, 256, 256, 256, 512, 512, 512, 512, 512, 512, 512, 512, 512, 16, 16, 16, 3072, 3072, 3072, 3072, 3072, 3072, 256, 256, 256, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 512, 512, 512, 32, 32, 32, 1024, 1024, 1024, 1024, 1024, 1024, 256, 256, 256, 256, 256, 256, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 32, 32, 32, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 512, 512, 512, 1, 1, 1, 1024, 1024, 1024, 32, 32, 32, 32, 32, 32, 45, 45, 45, 8, 8, 8, 512, 512, 512, 256, 256, 256, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 16, 16, 16, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, 16, 16, 16, 64, 64, 64, 8, 8, 8, 8, 8, 8, 8, 8, 8, 64, 64, 64, 64, 64, 64, 256, 256, 256, 64, 64, 64, 64, 64, 64, 512, 512, 512, 512, 512, 512, 512, 512, 512, 32, 32, 32, 32, 32, 32, 32, 32, 32, 128, 128, 128, 128, 128, 128, 128, 128, 128, 32, 32, 32, 128, 128, 128, 64, 64, 64, 64, 64, 64, 16, 16, 16, 256, 256, 256, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 256, 256, 256, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 256, 256, 256, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 256, 256, 256, 256, 256, 256, 1024, 1024, 1024, 1024, 1024, 1024, 256, 256, 256, 3072, 3072, 3072, 3072, 3072, 3072, 128, 128, 128, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 128, 128, 128, 128, 128, 128, 64, 64, 64, 256, 256, 256, 256, 256, 256, 512, 512, 512, 768, 768, 768, 768, 768, 768, 16, 16, 16, 32, 32, 32, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 512, 512, 512, 2048, 2048, 2048, 1024, 1024, 1024, 3072, 3072, 3072, 3072, 3072, 3072, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 3072, 3072, 3072, 3072, 3072, 3072, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 64, 64, 64, 96, 96, 96, 512, 512, 512, 64, 64, 64, 64, 64, 64, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 3072, 3072, 3072, 3072, 3072, 3072, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 512, 512, 512, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 64, 64, 64, 64, 64, 64, 256, 256, 256, 1024, 1024, 1024, 512, 512, 512, 256, 256, 256, 512, 512, 512, 1024, 1024, 1024, 512, 512, 512, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 512, 512, 512, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 3072, 3072, 3072, 3072, 3072, 3072, 2048, 2048, 2048, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 2048, 2048, 2048, 2048, 2048, 2048, 1024, 1024, 1024, 2048, 2048, 2048, 3072, 3072, 3072, 2048, 2048, 2048]

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

# new values
x = np.asarray([128,512,1024,2048,3072,2800])

Что-то не так с 3072 (все значения в мегабайтах).

Вот результат:

      100%      cdfv      kdev
128     26  0.129688  0.499376
512     55  0.275874  0.499671
1024    91  0.454159  0.499936
2048    12  0.062298  0.499150
3072     0  0.001556  0.498364
2800     1  0.004954  0.498573

Я не могу понять, почему это происходит... значение 3072 часто появляется в данных... Это гистограмма моих данных... это очень странно, потому что есть некоторые значения для 3072, а также для 4096. .

введите здесь описание изображения


person Usi Usi    schedule 14.06.2015    source источник
comment
Похоже, на самом деле вы запрашиваете p-значение, отражающее вероятность что новое значение взято из того же базового распределения, что и другие значения. Значение p отражает вероятность того, что значение по крайней мере будет экстремальным, то есть p(x ›= 500), а не p(x == 500).   -  person ali_m    schedule 14.06.2015
comment
спасибо @ali_m, как я могу получить p-значение?   -  person Usi Usi    schedule 14.06.2015
comment
Хотя с помощью KDE можно получить p-значение, это, вероятно, не лучший инструмент для работы, поскольку он практически гарантированно будет смещен в сторону чрезмерно консервативных (больших) p-значений (см. здесь). Более разумным вариантом может быть подгонка параметрического распределения к вашим предыдущим значениям, а затем получение p-значения путем оценки CDF по вашему новому значению. Как распространяются ваши реальные данные? Не могли бы вы показать гистограмму распределения или опубликовать образец ваших реальных данных?   -  person ali_m    schedule 14.06.2015
comment
Осторожнее с p-значениями, ребята. Очень важно педантично четко понимать, что такое р-значение, а что нет. Когда вы говорите, что p-значение отражает вероятность рисования значения, по крайней мере, как экстремального... это на самом деле неверно, потому что требует некоторого предположения нулевой гипотезы. В частности, p-значение не является производным от предположения, что подобранное значение является истинным значением. Таким образом, вы не можете подобрать параметрическую форму распределения, предположить, что это истинная форма, а затем наблюдать, насколько экстремальной выглядит следующая точка входящих данных при этом предполагаемом истинном распределении.   -  person ely    schedule 16.06.2015
comment
Если ваша цель состояла в том, чтобы использовать новые данные в качестве доказательства либо для подтверждения вашей веры в параметрическую подгонку, либо в поддержку/опровержение вашей убежденности в том, что новая точка данных была взята из того же распределения, это было бы статистической ошибкой. Вместо этого вам нужно будет постулировать нулевую гипотезу, например предположить, что вектор параметров для параметрической подгонки был полностью равен нулю (или некоторым разумным значениям по умолчанию, если все нули нефизичны). Затем вы можете посмотреть, насколько экстремальны ваши данные при распределении этой нулевой гипотезы и являются ли данные очень экстремальными (т. е. очень маленькое p-значение)...   -  person ely    schedule 16.06.2015
comment
тогда это рассматривается как некоторая форма доказательства того, что можно иметь некоторую степень уверенности в отклонении нулевой гипотезы, то есть отклонение идеи о том, что все истинные параметры равны нулю (или равны вашему базовому значению теста). И результатом теста будет просто некоторая степень уверенности в том, что размеры эффекта параметра существенно отличаются от того, какими были бы их значения при нулевой гипотезе. Это чрезвычайно важно, потому что неправильное понимание того, что вы можете и чего не можете сказать относительно того, какой вывод поддерживает вычисленное значение p, является большим источником ошибок.   -  person ely    schedule 16.06.2015
comment
Как правило, p-значение не является вероятностью того, что данные как экстремальные или более экстремальные будут наблюдаться в рамках подобранной (или истинной) модели. Значение p не является прямой функцией вероятности того, что подогнанная модель является истинной в зависимости от данных. Значение p не является вероятностью того, что нулевая гипотеза ложна. Значение p является только вероятностью наблюдения данных как экстремальных или более экстремальных при условии, что нулевая гипотеза верна.   -  person ely    schedule 16.06.2015
comment
Предлагаемая идея измерения выброса следующего наблюдения гораздо более тесно связана с измерением вероятности предполагаемой модели. в предположении, что данные берутся IID из какого-то базового дистрибутива. Еще одна идея состоит в том, чтобы использовать подобранную модель в качестве априорной, перестроить с использованием априорной и новой точки данных в байесовской модели, а затем вычислить Байесовское удивление между ними в качестве показателя того, насколько "удивительна" новая точка данных при предыдущем распределении.   -  person ely    schedule 16.06.2015
comment
@Mr.F, спасибо за ваш ответ, да, учитывая тренировочный набор ... например, учитывая тренировочный набор для смартфона, в котором все имеют атрибут RAM. Как вы понимаете, все значения находятся в этом диапазоне (0,4) ГБ. Если я получу новое значение 5, учитывая распределение моих обучающих данных, вполне вероятно, что на рынок может выйти новый смартфон с 5 ГБ оперативной памяти. Таким образом, формула на изображении, размещенном в вопросе, должна дать мне хорошую оценку.   -  person Usi Usi    schedule 16.06.2015
comment
Если я получу значение 100, формула должна дать мне плохой результат. Поэтому я отброшу это значение как оперативную память ... это значение может относиться к внутренней памяти или чему-то еще ... У меня два настоящих вопроса: 1. Правильно ли я понял это решение? Плотность ядра Гаусса подходит для получения того, что я хочу? 2. как я могу воспроизвести эту формулу в моем коде Python??   -  person Usi Usi    schedule 16.06.2015
comment
@Mr.F Я пытался намекнуть на предположение о нулевой гипотезе, когда сказал взято из того же базового [параметрического] распределения, что и другие значения, хотя я должен был сделать это более ясным.   -  person ali_m    schedule 16.06.2015
comment
@UsiUsi Было бы действительно полезно, если бы вы могли показать нам, как распределяются ваши реальные данные. Если эмпирическое распределение хорошо аппроксимируется некоторым параметрическим распределением, проблема становится намного проще.   -  person ali_m    schedule 16.06.2015
comment
@ali_m Понятно: я думаю, вы пытаетесь сказать, что хотите использовать что-то вроде классического теста NHST для определения того, имеют ли две выборки одно и то же среднее значение (или один и тот же вектор параметров или что-то еще), но в этом случае, когда одна из выборок имеет размер = 1.   -  person ely    schedule 16.06.2015
comment
@Mr.F Да, это один из способов выразить это. Я до сих пор не на 100% понимаю, что пытается сделать ОП, но похоже, что они пытаются выявить выбросы. Если эмпирическое распределение предыдущих значений хорошо аппроксимируется некоторым параметрическим распределением, то все, что необходимо, — это оценить CDF (или SF) при новом значении. Я полагаю, что можно также использовать PDF напрямую, хотя немного менее очевидно, как использовать его в качестве критерия отклонения.   -  person ali_m    schedule 16.06.2015
comment
Как выглядят ваши реальные данные, чрезвычайно важно! Поскольку данные вашего примера дискретны, подход, основанный на гауссовском ядре, кажется мне совершенно неуместным. Если вы сгладите с помощью ядра Гаусса, вы предскажете ненулевую плотность вероятности при нецелочисленных значениях ОЗУ, даже если вы никогда не наблюдаете их в своих реальных данных.   -  person ali_m    schedule 16.06.2015
comment
Также, если атрибутом может быть тактовая частота процессора?   -  person Usi Usi    schedule 16.06.2015
comment
В вашем примере мы на самом деле знаем, что данные взяты из дискретного равномерного распределения между 1 и 3. Поэтому, если мы предположим, что новая точка взята из того же базового распределения, мы знаем на самом деле вероятность того, что это что-то отличное от 1, 2 или 3, нулевая. Если вы считаете, что вероятность увидеть 5 должна быть отличной от нуля, то вам придется предположить, что данные были взяты из какого-то другого базового распределения. Как вы думаете, как должен выглядеть этот другой дистрибутив?   -  person ali_m    schedule 16.06.2015


Ответы (1)


Несколько общих комментариев, не вдаваясь в детали статистических моделей.

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

В связи с ответом glen_b, на который ссылается ali_m в комментарии:

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

Количество хвостовых наблюдений:

Если ваше самое большое наблюдение в выборке равно 4, и вы хотите узнать cdf при 5, то ваши данные не содержат информации об этом. Для хвостов, где у вас очень мало наблюдений, дисперсия непараметрической оценки, такой как оценки распределения ядра, будет большой в относительном выражении (это 1e-5 или 1e-20?).

В качестве альтернативы оценке плотности ядра или распределения ядра мы можем оценить распределение Парето для хвостовых частей. Например, возьмите самые большие 10 или 20 процентов наблюдений и подойдите к распределению Парето, а затем используйте это для экстраполяции плотности хвоста. Существует несколько пакетов Python для оценки степенного закона, которые можно использовать для этого.

обновить

Ниже показано, как рассчитать «выбросы» с использованием допущения о параметрическом нормальном распределении и гауссовой ядерной оценки плотности с фиксированной полосой пропускания.

Это действительно правильно только в том случае, если выборка исходит из непрерывного распределения или может быть аппроксимирована непрерывным распределением. Здесь мы притворяемся, что выборка, имеющая только 3 различных значения, получена из нормального распределения. По сути, рассчитанное значение cdf похоже на меру расстояния, а не на вероятность для дискретной случайной величины.

Здесь используется kde из scipy.stats с фиксированной пропускной способностью вместо версии statsmodels.

Я не уверен, как пропускная способность устанавливается в scipy gaussian_kde, поэтому мой выбор фиксированной пропускной способности, равный scale, скорее всего, неверен. Я не знаю, как бы я выбрал пропускную способность, если есть только три различных значения, в данных недостаточно информации. Пропускная способность по умолчанию предназначена для распределений, которые являются приблизительно нормальными или, по крайней мере, с одним пиком.

import numpy as np
from scipy import stats

# data
ram = np.array([2, <truncated from data in description>, 3])

loc = ram.mean()
scale = ram.std()

# new values
x = np.asarray([-1, 0, 2, 3, 4, 5, 100])

# assume normal distribution
cdf_val = stats.norm.cdf(x, loc=loc, scale=scale)
cdfv = np.minimum(cdf_val, 1 - cdf_val)

# use gaussian kde but fix bandwidth
kde = stats.gaussian_kde(ram, bw_method=scale)
kde_val = np.asarray([kde.integrate_box_1d(-np.inf, xx) for xx in  x])
kdev = np.minimum(kde_val, 1 - kde_val)


#print(np.column_stack((x, cdfv, kdev)))
# use pandas for prettier table
import pandas as pd
print(pd.DataFrame({'cdfv': cdfv, 'kdev': kdev}, index=x))

'''
          cdfv      kdev
-1    0.000096  0.000417
 0    0.006171  0.021262
 2    0.479955  0.482227
 3    0.119854  0.199565
 5    0.000143  0.000472
 100  0.000000  0.000000
 '''
person Josef    schedule 14.06.2015
comment
Учитывая ваше обновление, все, что я сказал, по-прежнему применимо, за исключением того, что это подходит для непрерывных данных или, по крайней мере, для многих дискретных значений в поддержке, так что непрерывный cdf является хорошим приближением к дискретному cdf. Однако вам необходимо включить некоторую предварительную информацию о точках, которых нет в поддержке, например, 5 близко к 4, если мы никогда раньше не видели 5 или больше. Другой пример: возможен ли дробный подсчет количества процессоров? Можем ли мы иметь компьютер с 2,5 ЦП, или мы можем исключить, что это количество ЦП, если мы видим 2,5? - person Josef; 16.06.2015
comment
С точки зрения статистики я бы рассматривал это просто как проблему непараметрической классификации. Учитывая оценочные непараметрические плотности для каждой категории, мы можем использовать cdf для расчета близости нового наблюдения к различным категориям. (Как непараметрический полиномиальный логит) - person Josef; 16.06.2015
comment
Для более простого начала я бы просто предположил нормальное распределение, вычислил средние значения и отклонения и использовал нормальный cdf в качестве меры отклонения. Если аппроксимация непрерывным распределением имеет смысл, я бы усовершенствовал тот же подход с помощью ядерных функций распределения. - person Josef; 16.06.2015
comment
Не могли бы вы привести пример? - person Usi Usi; 16.06.2015
comment
По умолчанию stats.gaussian_kde использует коэффициент Скотта для получения оценки оптимальной пропускной способности ядра. Этот метод оптимален для нормально распределенных данных (что, очевидно, здесь не так...). - person ali_m; 16.06.2015
comment
Большое спасибо за ваш отличный ответ ... но он упускает что-то действительно важное для меня ... Я могу рассчитать оценку между [0,1] для нового значения. Он должен быть близок к 1, если соответствует распределению (или близок к значению 5). - person Usi Usi; 18.06.2015
comment
Нет, наибольшее значение будет 0,5 в медиане. Если вы хотите, чтобы это было 1, то вы можете умножить значение cdf (хвост) на 2. Тогда это соответствовало бы двусторонней альтернативе, если бы это была проверка гипотезы. На самом деле это звучит более правдоподобно, поскольку вам все равно, находитесь ли вы в верхнем или нижнем хвосте. (Еще раз подчеркнем, что это для непрерывного приближения. Принцип тот же для дискретных распределений, но cdf будет ступенчатой ​​функцией в дискретных точках.) - person Josef; 18.06.2015
comment
[1024, 1, 1024, 1000, 1024, 128, 1536, 16, 192, 2048, 2000, 2048, 24, 250, 256, 278, 288, 290, 3072, 3, 3000, 3072, 32, 964, 40 , 4, 4096, 448, 45, 512, 576, 64, 768, 8, 96] У меня есть эти значения в мегабайтах... как вы думаете, это работает хорошо? Я должен установить порог - person Usi Usi; 23.06.2015
comment
Получение пропускной способности для kde требует некоторых испытаний, потому что данные не выглядят близкими к непрерывному одномодальному распределению. В документации для scipy есть пример того, как установить его как кратное предопределенным факторам Скотта или Сильвермана. Что-то вроде 2 или 10-кратного увеличения этого коэффициента может работать в более широком диапазоне. Также для МБ может быть полезно преобразовать данные, например. с лог2. np.histogram(np.log2(np.sort(a))) - person Josef; 23.06.2015