有没有办法计算make_blobs生成的数据集的cluster_std?

时间:2019-06-11 02:03:58

标签: python numpy scikit-learn standard-deviation data-generation

make_blobs()用于生成各向同性的高斯Blob进行聚类。

参数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 个答案:

答案 0 :(得分:2)

如果我们没有在axis中提及np.std()值,那么所有数据点将合并为一个数组,然后计算标准差。

来自Documentation

  

轴:无,为整数的int或元组,可选的Axis或沿其排列的轴
  计算标准偏差。默认值是计算
  展平数组的标准偏差。

即使提到轴,也不会获得预期的结果

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

原因是我们之前提供的标准差是针对每个聚类的,而不是针对整个数据集的。

来自Documentation:

  

cluster_std:浮点数或浮点序列,可选(默认= 1.0)The
  聚类的标准偏差。

现在,如果我们计算每个聚类的标准偏差:

>>> 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 :(得分:1)

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