为什么在集群之前跨行而不是跨列缩放以标准化(预处理)数据

jus*_*tin 3 python cluster-analysis k-means scikit-learn

我非常困惑,无法在互联网上找到有关数据预处理群集的以下问题的令人信服的答案。

根据Python 文档,当我们使用sckit学习库中的内置命令进行预处理时,假设数据被表示为N x D矩阵,其中行是样本,列是特征,则我们将各行的均值设为零,并在同时,各行之间的标准偏差是统一的,如下所示:

X_scaled.mean(axis=0)
array([ 0.,  0.,  0.])

X_scaled.std(axis=0)
array([ 1.,  1.,  1.])
Run Code Online (Sandbox Code Playgroud)

我的问题是,我们是否应该使列的均值(特征而不是样本)为零,并且对于标准偏差也应相同,因为我们正在尝试标准化特征而不是样本。网站和其他资源始终跨行进行标准化,但它们从未解释为什么?

Jef*_*man 5

我希望您希望在样本中标准化给定功能的值。如果您通过给定样本的各个特征对它们的数据进行归一化,则会浪费很多信息。那将是用于比较特征(很少有意义),而不是用于比较特征的样本。

我不知道numpy或sklearn,所以要花点儿力气,但是在进行归一化时,您想要归一化(使用相同的参数)给定特征的所有数据,以将该特征的所有值纳入(-1 ... +1),平均值为零(或类似的值)。您将针对每个功能分别执行此操作,因此它们都将落在该范围内,每个功能的均值为零。

考虑一个示例,如果您对给定样本的所有功能进行了归一化。

        height weight age
person1 180    65     50
person2 140    45     50
Run Code Online (Sandbox Code Playgroud)

如果我们对要素中的person1的值进行归一化,然后对person2进行相同的处理,则person2的年龄似乎与person1的年龄不同!

如果我们对给定列的样本进行归一化,则这些关系仍然成立。他们的年龄会匹配;person1更高,person2更低。但是所有功能的所有值都将适合后续分析所需的分布规则。


Ber*_*man 5

有一个地方可以标准化您的样本。一个例子是当您的功能很重要时。在这种情况下,将每个样本归一化为单位 l1-norm 有效地将每个特征更改为该样本总计数的百分比。

Sklearn'sNormalizer用于样本归一化,可以归一化为 l1 或 l2 范数。

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Normalizer.html