对类似数据进行分组以最大化组内相关性并最小化组间相关性

时间:2017-10-19 10:17:46

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

所以这是我的问题。 我每天有2000只股票的回报数据,下面是它的一小部分样本 (s1至s8,第1天至第15天)

我会调用我的数据" 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)

按降序对相关列表进行熔化(展平)并删除重复项和相关系数为1的行(使用重构库)

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数据框中,我选择所有对&#34; s7&#34;包含并提取出现在列表顶部的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(甚至更小),但我只是卡住了。

我搜索了谷歌,stackoverflow,交叉验证,我得知机器学习/时间序列聚类/分类可能是我正在寻找的答案。

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

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

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

任何人都可以解释或指导我具体要找什么?

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

1 个答案:

答案 0 :(得分:0)

使用分层聚类。

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