【问题标题】:Grouping similar data to maximize intra-group correlation and minimize inter-group correlation将相似数据分组以最大化组内相关性并最小化组间相关性
【发布时间】:2018-03-31 08:37:08
【问题描述】:

所以这是我的问题。 我有 2000 只股票的每日收益数据,下面是其中的一个小样本 (s1 到 s8,day1 到 day15)

我将我的数据称为“df”。

> df[1:15,1:8]
          s1        s2         s3         s4        s5        s6        s7        s8
1  -0.026410 -0.001030 -0.0027660  0.0126500 -0.030110  0.001476 -0.008271 -0.005299
2  -0.018990 -0.013680 -0.0092050 -0.0008402 -0.002739 -0.014170 -0.006091 -0.011920
3   0.004874  0.024140 -0.0002107 -0.0084770 -0.006825 -0.001448 -0.002724 -0.003132
4   0.019300 -0.004649  0.0223400  0.0080200 -0.008197 -0.015270  0.004064 -0.008149
5   0.010350 -0.010650  0.0087780  0.0059960 -0.001390 -0.006454  0.018990  0.002822
6   0.028650  0.010490  0.0157200 -0.0004123  0.019750 -0.005902  0.004261  0.019110
7   0.004203 -0.002682 -0.0099840 -0.0070060 -0.025670 -0.014550 -0.016700 -0.011580
8  -0.042170 -0.019490 -0.0023140 -0.0083030 -0.018170  0.021160 -0.006864 -0.009438
9   0.017250  0.026600  0.0031630 -0.0069090  0.035990  0.008429  0.001500 -0.011830
10 -0.037400 -0.022370  0.0088460  0.0012690 -0.050820 -0.025300 -0.028040 -0.023790
11 -0.091140 -0.018830  0.0052160 -0.0403000  0.001410 -0.007050 -0.024340 -0.013110
12 -0.051620  0.004791  0.0336000 -0.0094320 -0.018320 -0.019490 -0.044080 -0.024020
13  0.007711  0.002158 -0.0177400  0.0090470 -0.004346 -0.001562 -0.096030  0.015840
14  0.041440 -0.001072 -0.0168400  0.0180300 -0.012980 -0.015280  0.059780  0.014730
15 -0.042620 -0.025560 -0.0180200 -0.0115200  0.033320 -0.015150 -0.014580 -0.012710

我需要一种对它们进行分组的方法,以便最大化组内相关性和最小化组间相关性。

例如,我可以将它们随机分成两组,如下所示: (s1, s2, s3, s4) 和 (s5, s6, s7, s8) 问题是,有些股票可能相互关联,而有些则可能不相关。

所以我的解决方案是:

获取相关矩阵(假设 Pearson 的方法工作正常)

cor_df <- cor(df)

melt(flatten) 按降序排列相关列表,并删除相关系数 = 1 的重复项和行(使用 reshape 库)

cor_df_melt <- melt(cor_df)
names(cor_df_melt)[1] <- "x1"
names(cor_df_melt)[2] <- "x2"
names(cor_df_melt)[3] <- "corr"
cor_df_ordered <- cor_df_melt[order(-cor_df_sample_melt["corr"]),]

然后我对扁平矩阵进行编号,删除重复项(偶数编号)和相关系数 = 1 的行

cor_df_numbered <- cbind(row=c(1:nrow(cor_df_ordered)),cor_df_ordered)
cor_df_ready <- cor_df_numbered[cor_df_numbered$row%%2==0&cor_df_numbered$corr%%2!=1,2:4]

在此之后,我的数据框以降序排列,每一对的相关系数排列良好,如下所示:

> cor_df_ready
   x1 x2       corr
63 s7 s8 0.49223783
57 s1 s8 0.42518667
50 s2 s7 0.42369762
49 s1 s7 0.40824283
58 s2 s8 0.40395569
42 s2 s6 0.40394894
54 s6 s7 0.39408677
62 s6 s8 0.38536734
34 s2 s5 0.36882709
53 s5 s7 0.36066870
45 s5 s6 0.35734278
59 s3 s8 0.34295713
51 s3 s7 0.34163733
61 s5 s8 0.33264868
9  s1 s2 0.32812763
41 s1 s6 0.31221715
18 s2 s3 0.30692909
43 s3 s6 0.29390325
33 s1 s5 0.28845243
35 s3 s5 0.27859972
17 s1 s3 0.25039209
52 s4 s7 0.12989487
60 s4 s8 0.12095196
25 s1 s4 0.10902471
26 s2 s4 0.09471694
44 s4 s6 0.08039435
36 s4 s5 0.06957264
27 s3 s4 0.06027389

(顺便说一句,我不知道为什么行号会这样混乱......谁能解释一下?)

从这里开始,我的直觉是相关系数最高的顶部对 0.49223783 (s7, s8),它们必须在同一组中。

因此,从我的 cor_df_ready 数据框中,我选择了所有包含“s7”的对,并提取了出现在列表顶部的 4 只股票(s7、s8、s2、s1)并将它们命名为第 1 组。

然后我从我的 cor_df_ready 中排除了包括 (s7, s8, s2, s1) 在内的所有行,并重复该过程以得出第二组 (s3, s4, s5, s6)。

在这个例子中我不必重复这个过程,因为只剩下最后一组了。

然后,我得到了每个组的相关矩阵,并添加了每个相关系数的总和:

group1_cor <- cor(group1)
group2_cor <- cor(group2)

cor_sum <- sum(group1_cor) + sum(group2_cor)

然后我得到每组中每一行的均值,并计算两组均值的相关矩阵之和,并命名为cor_sum_mean。

最后,我计算了:cor_sum_mean/cor_sum

直觉是,组内相关性最大化会使 cor_sum 最大化,而组间相关性最小化也会使 cor_sum_mean 最小化。

我希望得到尽可能大的 cor_sum(组内相关性)和尽可能小的 cor_sum_mean(组内相关性)。

对整个数据使用我的方法,我将 2000 只股票分成 10 组,我得到的是

#cor_sum = 131923.1
#cor_sum_mean = 83.1731
#cor_sum_mean/cor_sum = 0.0006305

我知道我可以将 cor_sum_mean/cor_sum 降低到 0.000542(甚至更小),但我只是卡住了。

我搜索了 google、stackoverflow、crossvalidated,我发现机器学习/时间序列聚类/分类可能是我正在寻找的答案。

以下两个预先发布的问题似乎很有帮助,但我才刚刚开始学习数据科学,所以我很难理解它们......

https://stats.stackexchange.com/questions/9475/time-series-clustering/19042#19042

https://stats.stackexchange.com/questions/3238/time-series-clustering-in-r

谁能解释或指导我具体寻找什么?

这是一个很长的问题...感谢阅读!

【问题讨论】:

    标签: r time-series classification cluster-analysis correlation


    【解决方案1】:

    使用层次聚类。

    通过平均关联,您可以优化平均相关性。

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2019-06-26
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      相关资源
      最近更新 更多