Python—使用K-means进行集群。一些方差为零的列
我有一个数据集,由约200个99x20频率数组组成,每列求和为一。我用热图绘制了这些,比如。每个数组都非常稀疏,每99个位置只有约1-7/20个值为非零 然而,我想根据它们的频率分布的相似程度(最小欧几里德距离或类似的东西)对这些样本进行聚类。我已将每个99x20阵列排列成一个1980x1阵列,并将它们聚合成一个200x1980观测阵列 在找到集群之前,我尝试使用Python—使用K-means进行集群。一些方差为零的列,python,cluster-analysis,bioinformatics,k-means,variance,Python,Cluster Analysis,Bioinformatics,K Means,Variance,我有一个数据集,由约200个99x20频率数组组成,每列求和为一。我用热图绘制了这些,比如。每个数组都非常稀疏,每99个位置只有约1-7/20个值为非零 然而,我想根据它们的频率分布的相似程度(最小欧几里德距离或类似的东西)对这些样本进行聚类。我已将每个99x20阵列排列成一个1980x1阵列,并将它们聚合成一个200x1980观测阵列 在找到集群之前,我尝试使用scipy.cluster.vq.whiten对数据进行增白whiten通过方差对每个列进行规范化,但由于我展平数据数组的方式,我有一
scipy.cluster.vq.whiten
对数据进行增白whiten
通过方差对每个列进行规范化,但由于我展平数据数组的方式,我有一些(8)列的频率都为零,因此方差为零。因此,白色数组具有无穷多个值,质心查找失败(或给出约200个质心)
我的问题是,我应该如何着手解决这个问题?到目前为止,我已经试过了
- 不要把数据涂成白色。这使得k-means每次运行时都会给出不同的质心(这在某种程度上是意料之中的),尽管大大增加了
关键字iter
- 在我展平阵列之前,先对阵列进行换位。零方差列只是移动李>
for i in range(arr.shape[1]):
if np.abs(arr[:,i].std()) < 1e-8: continue
arr[:,i] /= arr[:,i].std()
范围内i的(arr.shape[1]):
如果np.abs(arr[:,i].std())<1e-8:继续
arr[:,i]/=arr[:,i].std()
这似乎是可行的,但我不确定这是否会以任何方式影响集群
谢谢删除所有0的列不应使数据产生偏差。如果您有N维数据,但一个维度都是相同的数字,那么它与N-1维数据完全相同。这种有效维数的性质称为
考虑三维数据,但所有数据点都位于x=0平面上。你能看到这与2D数据是如何完全相同的吗 首先,删除常量列非常好。显然,他们不提供信息,因此没有理由保留它们 然而,K-means对于稀疏向量不是特别好。问题是,最有可能产生的“质心”彼此之间比集群成员更相似。 请看,在稀疏数据中,每个对象在某种程度上都是一个异常值。K-均值对异常值非常敏感,因为它试图最小化平方和 我建议您执行以下操作:
作为次要编码点,检查0.0浮点值时不要使用相等检查
如果arr[:,i].std()==0
应该是如果abs(arr[:,i].std())
,其中epsilon是一个非常小的值,如0.0000001。否则,可能会出现舍入错误,导致0值浮动显示为非零。对于给定的问题,它可能总是很好,但一般来说,这是一个更好的方法来执行浮动的“平等”检查。@ PyCE谢谢,编辑。那么你会考虑我已经做了什么有效的解决方案吗?我不确定,但是你可能需要改变IF到:if ALL(NP.ABS(ARR[,I],STD())<1E-8):继续<代码> ARR[:,i]。返回一个浮点数,因此我认为不需要全部浮点数。