gpt4 book ai didi

python - kmeans 聚类之前的 Scipy 白化

转载 作者:太空宇宙 更新时间:2023-11-04 05:39:40 26 4
gpt4 key购买 nike

我正在尝试使用 sklearn.cluster 中的 kmeans 对一些数据进行聚类。但我想先美化我的数据。我有一个包含以下三列的 Pandas df(有几百行):

1) zipcode
2) highclust
3) callclust

我想美白(使用scipy.cluster.vq.whiten)。从我到目前为止的研究来看, df 列必须在美白之前转换为矩阵。所以我做了:

features = df.as_matrix(columns = ['highclust', 'callclust'])

然后我使用了whiten(features)

效果很好,但现在我想将这些值恢复到原始 df 中。

问题是我没有任何值可以将其合并回去。如果我在创建 features 时将 zipcode 带入 features 中,zipcode 会与 highclustcallclust 一起变白,渲染它没用。

最佳答案

最简单的解决方案是先保存邮政编码,美化,然后重新应用邮政编码。

from scipy.cluster.vq import whiten
import pandas as pd

zips = df.zipcode
df = pd.DataFrame(whiten(df), columns=df.columns)
df['zipcode'] = zips

您也可以自己进行计算,而不是使用 lambda 函数使用 scipy。

np.random.seed(0)

whiten_cols = ['highclust', 'callclust']
df = pd.DataFrame({'zipcode': [1, 2, 3, 4, 5],
'highclust': np.random.randn(5),
'callclust': np.random.randn(5)})[['zipcode'] + whitencols]

>>> df
zipcode highclust callclust
0 1 1.764052 -0.977278
1 2 0.400157 0.950088
2 3 0.978738 -0.151357
3 4 2.240893 -0.103219
4 5 1.867558 0.410599

>>> df.std()
zipcode 1.581139
highclust 0.745445
callclust 0.717038
dtype: float64

# Whiten data.
df.loc[:, whiten_cols] = df[whiten_cols].apply(lambda col: col / col.std())

>>> df
zipcode highclust callclust
0 1 2.366442 -1.362937
1 2 0.536803 1.325018
2 3 1.312958 -0.211087
3 4 3.006115 -0.143952
4 5 2.505293 0.572631

>>> df.std()
zipcode 1.581139
highclust 1.000000
callclust 1.000000
dtype: float64

默认情况下,Pandas 将标准偏差归一化为 N-1。这在大型数据集上不会成为问题,但您可以将 scipy 结果与以下内容相匹配:

df.loc[:, whiten_cols] = df[whiten_cols].apply(lambda col: col / col.std(ddof=0))

>>> df
zipcode highclust callclust
0 1 2.645763 -1.523810
1 2 0.600164 1.481415
2 3 1.467932 -0.236002
3 4 3.360938 -0.160943
4 5 2.801003 0.640221

如果你更喜欢直接使用 scipy:

# After resetting the seed and reinitializing the dataframe.
df.loc[:, whiten_cols] = whiten(df[whiten_cols].values)

>>> df
zipcode highclust callclust
0 1 2.645763 -1.523810
1 2 0.600164 1.481415
2 3 1.467932 -0.236002
3 4 3.360938 -0.160943
4 5 2.801003 0.640221

>>> df.std()
zipcode 1.581139
highclust 1.118034
callclust 1.118034
dtype: float64

scipy.cluster.vq.whiten

scipy.cluster.vq.whiten(obs, check_finite=True)[source] Normalize a group of observations on a per feature basis.

Before running k-means, it is beneficial to rescale each feature dimension of the observation set with whitening. Each feature is divided by its standard deviation across all observations to give it unit variance.

这是 source code对于美白:

obs = _asarray_validated(obs, check_finite=check_finite)
std_dev = std(obs, axis=0)
zero_std_mask = std_dev == 0
if zero_std_mask.any():
std_dev[zero_std_mask] = 1.0
warnings.warn("Some columns have standard deviation zero. "
"The values of these columns will not change.",
RuntimeWarning)
return obs / std_dev

关于python - kmeans 聚类之前的 Scipy 白化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34373448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com