这里的关键问题是要使用什么距离度量。
假设这是您的数据。
有什么不同?>>> import pandas as pd>>> data = pd.Dataframe(pd.np.random.rand(100, 50))>>> data[data > 0.2] = 1>>> data[data <= 0.2] = pd.np.nan>>> data.head() 0 1 2 3 4 5 6 7 8 9 ... 40 41 42 43 44 45 46 47 1 1 1 NaN 1 NaN NaN 1 1 1 ... 1 1 NaN 1 NaN 1 1 11 1 1 1 NaN 1 1 1 1 1 1 ... NaN 1 1 NaN NaN 1 1 12 1 1 1 1 1 1 1 1 1 1 ... 1 NaN 1 1 1 1 1 NaN3 1 NaN 1 NaN 1 NaN 1 NaN 1 1 ... 1 1 1 1 NaN 1 1 14 1 1 1 1 1 1 1 1 NaN 1 ... NaN 1 1 1 1 1 1 1
您可以将距离度量计算为每列之间不同的值的百分比。结果显示任意两列之间的%差异。
相关系数是多少?>>> zero_data = data.fillna(0)>>> distance = lambda column1, column2: (column1 - column2).abs().sum() / len(column1)>>> result = zero_data.apply(lambda col1: zero_data.apply(lambda col2: distance(col1, col2)))>>> result.head() 0 1 2 3 4 5 6 7 8 9 ... 40 0.00 0.36 0.33 0.37 0.32 0.41 0.35 0.33 0.39 0.33 ... 0.371 0.36 0.00 0.37 0.29 0.30 0.37 0.33 0.37 0.33 0.31 ... 0.352 0.33 0.37 0.00 0.36 0.29 0.38 0.40 0.34 0.30 0.28 ... 0.283 0.37 0.29 0.36 0.00 0.29 0.30 0.34 0.26 0.32 0.36 ... 0.364 0.32 0.30 0.29 0.29 0.00 0.31 0.35 0.29 0.29 0.25 ... 0.27
在这里,我们使用皮尔逊相关系数。这是一个完全有效的指标。具体来说,在二进制数据的情况下,它转换为phi系数。
>>> zero_data = data.fillna(0)>>> distance = lambda column1, column2: scipy.stats.pearsonr(column1, column2)[0]>>> result = zero_data.apply(lambda col1: zero_data.apply(lambda col2: distance(col1, col2)))>>> result.head() 0 1 2 3 4 5 6 1.000000 0.013158 0.026262 -0.059786 -0.024293 -0.078056 0.0540741 0.013158 1.000000 -0.093109 0.170159 0.043187 0.027425 0.1081482 0.026262 -0.093109 1.000000 -0.124540 -0.048485 -0.064881 -0.1618873 -0.059786 0.170159 -0.124540 1.000000 0.004245 0.184153 0.0425244 -0.024293 0.043187 -0.048485 0.004245 1.000000 0.079196 -0.099834
顺便说一句,这与使用Spearman R系数得到的结果相同。
欧几里得距离是多少?>>> zero_data = data.fillna(0)>>> distance = lambda column1, column2: pd.np.linalg.norm(column1 - column2)>>> result = zero_data.apply(lambda col1: zero_data.apply(lambda col2: distance(col1, col2)))>>> result.head() 0 1 2 3 4 5 6 0.000000 6.000000 5.744563 6.082763 5.656854 6.403124 5.9160801 6.000000 0.000000 6.082763 5.385165 5.477226 6.082763 5.7445632 5.744563 6.082763 0.000000 6.000000 5.385165 6.164414 6.3245553 6.082763 5.385165 6.000000 0.000000 5.385165 5.477226 5.8309524 5.656854 5.477226 5.385165 5.385165 0.000000 5.567764 5.916080
到现在为止,您已经了解了模式。创建一个
distance方法。然后将其成对应用于每一列
data.apply(lambda col1: data.apply(lambda col2: method(col1, col2)))
如果您的
distance方法依赖于零而不是
nans,请使用转换为零
.fillna(0)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)