scipy.pdist() 返回 NaN 值

Posted

技术标签:

【中文标题】scipy.pdist() 返回 NaN 值【英文标题】:scipy.pdist() returns NaN values 【发布时间】:2018-04-29 00:09:25 【问题描述】:

我正在尝试对时间序列进行聚类。簇内元素具有相同的形状但不同的尺度。因此,我想使用相关性度量作为聚类指标。我正在尝试相关性或皮尔逊系数距离(欢迎任何建议或替代方案)。 但是,当我运行 Z = links(dist) 时,以下代码会返回错误,因为 dist 中有一些 NaN 值。 time_series 中没有 NaN 值,这是由

确认的
np.any(isnan(time_series))

返回 False

from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import dendrogram, linkage

dist = pdist(time_series, metric='correlation') 
Z = linkage(dist)
fig = plt.figure()
dn = dendrogram(Z)
plt.show()

作为替代,我将使用皮尔逊距离

from scipy.stats import pearsonr

def pearson_distance(a,b):
    return 1 - pearsonr(a,b)[0]

dist = pdist(time_series, pearson_distance)`

但这会产生一些运行时警告并且需要很长时间。

【问题讨论】:

【参考方案1】:
scipy.pdist(time_series, metric='correlation')

如果您查看manual,correlation 选项除以差值。因此,您可能有两个相同的时间戳,将zero 除以zero 得到NaN

【讨论】:

好的,我验证了当两个序列之一对于所有时间步具有相同的值时,系数为 nan。这种情况应该怎么处理? 这真的取决于你的情况。您可以忽略并删除这些条目,如果它们没有物理/任何意义,就会出现这种情况。或者您可以将它们设置为零,但我不确定相关解释的含义。您的选择。 我需要对这些系列进行聚类,因此我需要一个指标来说明两个系列 a 和 b 是否相似(无论大小如何)。 然后删除这些值。所有时间步长都具有相同的值会随着时间的推移为您提供一个常数,因此基本上没有时间信息。在这种情况下,删除值的if 条件应该这样做。 (考虑在这种情况下将问题标记为已回答...) 如果我在任何常数系列的最后一个值上添加一个 epsilon 会怎样?所以这个非常小的扰动会导致方差不同于零

以上是关于scipy.pdist() 返回 NaN 值的主要内容,如果未能解决你的问题,请参考以下文章

为啥“valueAsNumber”返回 NaN 作为值?

无效的 LngLat 对象:(NaN, NaN) - getElementById 不返回值

如果输入值为 NaN,则返回零 [重复]

当所有值都是 NaN 时,Pandas 重新采样以返回 NaN

关于苹果真机 getFullYear()返回值为NAN的问题

Pandas 映射将所有值返回为 NaN [重复]