【问题标题】:scipy.pdist() returns NaN valuesscipy.pdist() 返回 NaN 值
【发布时间】: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)`

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

【问题讨论】:

    标签: python nan correlation pearson-correlation pdist


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

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

    【讨论】:

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