Есть ли способ для вычисления cluster_std набора данных, созданного make_blobs? - PullRequest
2 голосов
/ 11 июня 2019

make_blobs() используется для создания изотропных гауссовых капель для кластеризации.

параметр cluster_std - стандартное отклонение кластеров.

Я сгенерировал набор данных:

x, y = make_blobs(n_samples=100, centers=6,
                       cluster_std=0.60, random_state=1234)

и пытаюсь вычислить стандартное отклонение:

np.std(x)

выходы

5.122249276993561

что далеко от начального параметра 0.60.

Есть ли способ правильно рассчитать стандартное отклонение?

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Если мы не упоминаем значение axis в np.std(), то все точки данных объединяются в один массив, а затем вычисляется стандартное отклонение.

С Документация :

Ось: Нет или int или кортеж из целых, необязательные оси или осивдоль которого
вычисляется стандартное отклонение.По умолчанию вычисляется стандартное отклонение
уплощенного массива.

Даже если мы упомянем ось, мы не получим желаемый результат

np.std(x,axis=0)
array([5.51732287, 4.27190484])

Причинастандартное отклонение, которое мы предоставили ранее, относится к каждому кластеру, а не ко всему набору данных.

С Документация :

cluster_std: число с плавающей точкой или последовательность с плавающей точкой, необязательно (по умолчанию = 1,0) Стандартное отклонение
кластеров.

Теперь, если мы вычислим стандартное отклонение для каждого кластера:

>>> sample_size =  100
>>> x, y = make_blobs(n_samples=sample_size, centers=6,
                       cluster_std=0.60, random_state=1234)
>>> for i in range(6):
>>>     print(np.std(x[y==i], axis=0))

[0.34529312 0.71426966]
[0.50416947 0.62691032]
[0.41684885 0.69941778]
[0.5760022  0.58054362]
[0.59779626 0.52716869]
[0.64628073 0.49280287]

Тем не менее, значения не всегда близки к данному значению 0.60.

Теперь вычисляем статистическую часть!Только если мы увеличим размер выборки, мы увидим, что стандартное отклонение выборки становится близким к стандартному отклонению совокупности (это значение, которое мы указали ранее).

Если установить sample_size на 10,000,000результаты кажутся довольно близкими !!

[0.600691   0.60049266]
[0.60009299 0.60028479]
[0.60048685 0.60019785]
[0.60000098 0.60000844]
[0.59989123 0.60017014]
[0.60010969 0.59936852]
1 голос
/ 11 июня 2019

Из make_blobs() вы можете видеть, что спецификация стандартного отклонения 0.60 была получена в качестве аргумента в generator.normal(loc=centers[i], scale=std, size=(n, n_features)), то есть способ, которым sklearn генерирует точки данных для каждого кластера.

Вы должны рассчитать стандартное отклонение для каждого объекта в каждом кластере:

import numpy as np

for i in set(y):
    print('--> label {}'.format(i))
    for j in range(x.shape[1]):
        print('std for feature {}: {}'.format(j, np.std(x[y==i][:,j])))

и вы получите:

--> label 0
std for feature 0: 0.345293121830674
std for feature 1: 0.7142696641502757
--> label 1
std for feature 0: 0.5041694666576663
std for feature 1: 0.6269103210381141
--> label 2
std for feature 0: 0.4168488521809934
std for feature 1: 0.6994177825578384
--> label 3
std for feature 0: 0.5760022004454849
std for feature 1: 0.580543624607708
--> label 4
std for feature 0: 0.5977962642901783
std for feature 1: 0.5271686872743192
--> label 5
std for feature 0: 0.6462807280468825
std for feature 1: 0.4928028738564903
...