为啥在聚类之前跨行而不是列来标准化(预处理)数据
Posted
技术标签:
【中文标题】为啥在聚类之前跨行而不是列来标准化(预处理)数据【英文标题】:Why scale across rows not columns for standardizing (preprocessing) of Data before clustering为什么在聚类之前跨行而不是列来标准化(预处理)数据 【发布时间】:2018-12-04 13:37:53 【问题描述】:对于以下有关数据预处理聚类的问题,我很困惑,无法在互联网上找到令人信服的答案。
根据 Python documentation,当我们使用 sckit learn 库中的内置命令进行预处理时,假设数据被公式化为 N x D
矩阵,其中行是样本,列是特征,我们使平均值行为零,同时跨行的标准偏差是统一的,如下所示:
X_scaled.mean(axis=0)
array([ 0., 0., 0.])
X_scaled.std(axis=0)
array([ 1., 1., 1.])
我的问题是,我们是否应该使整个列(特征而不是样本)的平均值为零,而标准差也一样,因为我们试图标准化特征而不是样本。网站和其他资源总是跨行标准化,但从不解释原因?
【问题讨论】:
我希望您希望跨样本标准化给定特征的值。如果你对给定样本的特征数据进行归一化,你就丢掉了很多信息。那将用于比较特征,而不是用于比较特征的样本。 但是当人们说特征有不同的范围时这有点误导,所以让我们缩放它们,似乎他们的意思是缩放给定样本的特征,因为假设我们有体重、年龄和A 先生的身高是 65 公斤、180 厘米和 20 岁,它们是不同的范围,我认为我们将这些特征设为 0 均值和单位方差。您能否详细说明这一点,或者您是否认为将您的评论写成答案 除了@JeffLearman 的回答,我可以补充一点,跨行标准化(正如 OP 最初认为的那样)也是图像处理中的主要内容,以便使所有样本(图像)一种标准颜色(像素值),并在那里取得了可喜的成果。 您可能还希望在每行(例如调查的受访者)有自己的集中趋势(例如,一些受访者长期以 1 的比例响应较高的数字)的情况下将每一行居中- 10 相对于其他人) 【参考方案1】:有一个地方可以标准化您的样本。一个例子是当您的功能很重要时。在这种情况下,将每个样本归一化为单位 l1-norm 可以有效地将每个特征更改为该样本总计数的百分比。
Sklearn 的Normalizer
用于样本归一化,可以归一化为 l1 或 l2 范数。
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Normalizer.html
【讨论】:
好点。我想不出一个用这种方式标准化的好例子,但你想出了一个。【参考方案2】:我希望您希望跨样本对给定特征的值进行标准化。如果你对给定样本的特征数据进行归一化,你就丢掉了很多信息。那将用于比较特征(这很少有意义),而不是用于比较特征的样本。
我不知道 numpy 或 sklearn,所以对此持保留态度,但是在规范化时,您希望规范化(使用相同的参数)给定特征的所有数据,以将该特征的所有值带入(-1 ... +1) 的范围,平均值为零(或类似的值)。您需要为每个特征单独执行此操作,因此它们最终都会在该范围内,每个特征的均值为零。
考虑一个示例,如果您对给定样本的所有特征进行了归一化。
height weight age
person1 180 65 50
person2 140 45 50
如果我们对 person1 的所有特征值进行归一化,然后对 person2 做同样的事情,那么 person2 的年龄似乎与 person1 不同!
如果我们对给定列的样本进行标准化,那么关系仍然会成立。他们的年龄相匹配; person1 会更高,person2 会更轻。但所有特征的所有值都将符合后续分析所需的分布规则。
【讨论】:
以上是关于为啥在聚类之前跨行而不是列来标准化(预处理)数据的主要内容,如果未能解决你的问题,请参考以下文章