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
。
有没有一种方法可以正确计算标准偏差?
答案 0 :(得分:2)
如果我们没有在axis
中提及np.std()
值,那么所有数据点将合并为一个数组,然后计算标准差。
轴:无,为整数的int或元组,可选的Axis或沿其排列的轴
计算标准偏差。默认值是计算
展平数组的标准偏差。
即使提到轴,也不会获得预期的结果
np.std(x,axis=0)
array([5.51732287, 4.27190484])
原因是我们之前提供的标准差是针对每个聚类的,而不是针对整个数据集的。
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