Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—使用K-means进行集群。一些方差为零的列_Python_Cluster Analysis_Bioinformatics_K Means_Variance - Fatal编程技术网

Python—使用K-means进行集群。一些方差为零的列

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通过方差对每个列进行规范化,但由于我展平数据数组的方式,我有一

我有一个数据集,由约200个99x20频率数组组成,每列求和为一。我用热图绘制了这些,比如。每个数组都非常稀疏,每99个位置只有约1-7/20个值为非零

然而,我想根据它们的频率分布的相似程度(最小欧几里德距离或类似的东西)对这些样本进行聚类。我已将每个99x20阵列排列成一个1980x1阵列,并将它们聚合成一个200x1980观测阵列

在找到集群之前,我尝试使用
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-均值对异常值非常敏感,因为它试图最小化平方和

我建议您执行以下操作:

  • 查找适用于您的域的相似性度量。花很多时间在这个问题上,如何为您的特定用例捕获相似性

  • 获得相似性后,计算200x200相似性矩阵。由于您的数据集非常小,您实际上可以运行昂贵的聚类方法,如分层聚类,这无法扩展到数千个对象。如果您愿意,还可以尝试光学群集或DBSCAN。但特别是,如果您的数据集更大,DBSCAN实际上更有趣。对于微小的数据集,分层聚类很好


  • 作为次要编码点,检查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]。返回一个浮点数,因此我认为不需要全部浮点数。