【问题标题】:is there a way to compute the cluster_std of the dataset generated by make_blobs?有没有办法计算 make_blob 生成的数据集的 cluster_std?
【发布时间】:2019-06-11 02:03:58
【问题描述】:

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 相差甚远。

有没有办法正确计算标准差?

【问题讨论】:

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


    【解决方案1】:

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

    来自Documentation

    轴:无或整数或整数元组,可选轴或轴
    计算标准差。默认是计算
    展平数组的标准差。

    即使我们提到轴,我们也不会得到想要的结果

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

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

    来自Documentation:

    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]
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • 感谢您的回答。这些标准差和原来的0.60有什么关系?
      • 原始0.60 已作为generator.normal(loc=centers[i], scale=std, size=(n, n_features)) 中的参数接收,这是sklearn 为每个集群生成数据点的方式。
      猜你喜欢
      • 2017-05-27
      • 2022-01-19
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多