<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          4種聚類算法及可視化(Python)

          共 7520字,需瀏覽 16分鐘

           ·

          2023-08-29 15:07

             
          來源:數(shù)據(jù)STUDIO 算法進(jìn)階

          本文約2300字,建議閱讀12分鐘

          在這篇文章中,基于20家公司的股票價(jià)格時(shí)間序列數(shù)據(jù)。


          在這篇文章中,基于20家公司的股票價(jià)格時(shí)間序列數(shù)據(jù)。根據(jù)股票價(jià)格之間的相關(guān)性,看一下對(duì)這些公司進(jìn)行聚類的四種不同方式。

          蘋果(AAPL),亞馬遜(AMZN),F(xiàn)acebook(META),特斯拉(TSLA),Alphabet(谷歌)(GOOGL),殼牌(SHEL),Suncor能源(SU),埃克森美孚公司(XOM),Lululemon(LULU),沃爾瑪(WMT),Carters(CRI)、 Childrens Place (PLCE), TJX Companies (TJX), Victoria's Secret & Co (VSCO), Macy's (M), Wayfair (W), Dollar Tree (DLTR), CVS Caremark (CVS), Walgreen (WBA), Curaleaf Holdings Inc. (CURLF)

          我們的DataFrame df_combined,包含上述公司413天的股票價(jià)格,沒有遺漏數(shù)據(jù)。

          目標(biāo)

          我們的目標(biāo)是根據(jù)相關(guān)性對(duì)這些公司進(jìn)行分組,并檢查這些分組的有效性。例如,蘋果、亞馬遜、谷歌和Facebook通常被視為科技股,而Suncor和Exxon被視為石油和天然氣股。我們將檢查我們是否可以得到這些分類,只使用這些公司的股票價(jià)格之間的相關(guān)性。

          使用相關(guān)性來對(duì)這些公司進(jìn)行分類,而不是使用股票價(jià)格,如果使用股票價(jià)格,具有相似股票價(jià)格的公司將被集中在一起。但在這里,我們想根據(jù)股票價(jià)格的行為來對(duì)公司進(jìn)行分類。實(shí)現(xiàn)這一目標(biāo)的一個(gè)簡(jiǎn)單方法是使用股票價(jià)格之間的相關(guān)性。


          最佳集群數(shù)量

          尋找集群的數(shù)量是一個(gè)自身的問題。有一些方法,如elbow方法,可以用來尋找最佳的集群數(shù)量。然而,在這項(xiàng)工作中,嘗試將這些公司分成4個(gè)集群。理想情況下,這四個(gè)群組必須是科技股、石油和天然氣股、零售股和其他股票。

          首先獲得我們所擁有的數(shù)據(jù)框架的相關(guān)矩陣。


          correlation_mat=df_combined.corr()


          定義一個(gè)效用函數(shù)來顯示集群和屬于該集群的公司。


          # 用來打印公司名稱和它們所分配的集群的實(shí)用函數(shù)
          def print_clusters(df_combined,cluster_labels):
            cluster_dict = {}
            for i, label in enumerate(cluster_labels):
                if label not in cluster_dict:
                    cluster_dict[label] = []
                cluster_dict[label].append(df_combined.columns[i])

            # 打印出每個(gè)群組中的公司 -- 建議關(guān)注@公眾號(hào):數(shù)據(jù)STUDIO 定時(shí)推送更多優(yōu)質(zhì)內(nèi)容
            for cluster, companies in cluster_dict.items():
                print(f"Cluster {cluster}{', '.join(companies)}")


          方法1:K-means聚類法


          K-means聚類是一種流行的無監(jiān)督機(jī)器學(xué)習(xí)算法,用于根據(jù)特征的相似性將相似的數(shù)據(jù)點(diǎn)分組。該算法迭代地將每個(gè)數(shù)據(jù)點(diǎn)分配給最近的集群中心點(diǎn),然后根據(jù)新分配的數(shù)據(jù)點(diǎn)更新中心點(diǎn),直到收斂。我們可以用這個(gè)算法根據(jù)相關(guān)矩陣對(duì)我們的數(shù)據(jù)進(jìn)行聚類。

          from sklearn.cluster import KMeans

          # Perform k-means clustering with four clusters
          clustering = KMeans(n_clusters=4, random_state=0).fit(correlation_mat)

          # Print the cluster labels
          cluster_labels=clustering.labels_
          print_clusters(df_combined,cluster_labels)

          k-means聚類的結(jié)果


          正如預(yù)期的那樣,亞馬遜、Facebook、特斯拉和Alphabet被聚集在一起,石油和天然氣公司也被聚集在一起。此外,沃爾瑪和MACYs也被聚在一起。然而,我們看到一些科技股,如蘋果與沃爾瑪聚集在一起。

          方法2:聚和聚類法Agglomerative Clustering

          聚合聚類是一種分層聚類算法,它迭代地合并類似的聚類以形成更大的聚類。該算法從每個(gè)對(duì)象的單獨(dú)聚類開始,然后在每一步將兩個(gè)最相似的聚類合并。

          from sklearn.cluster import AgglomerativeClustering

          # 進(jìn)行分層聚類
          clustering = AgglomerativeClustering(n_clusters=n_clusters, 
                                               affinity='precomputed'
                                               linkage='complete'
                                              ).fit(correlation_mat)

          # Display the cluster labels
          print_clusters(df_combined,clustering.labels_)

          分層聚類的結(jié)果


          這些結(jié)果與我們從k-means聚類得到的結(jié)果略有不同。我們可以看到一些石油和天然氣公司被放在了不同的聚類中。

          方法3:親和傳播聚類法 AffinityPropagation

          親和傳播聚類是一種聚類算法,不需要事先指定聚類的數(shù)量。它的工作原理是在成對(duì)的數(shù)據(jù)點(diǎn)之間發(fā)送消息,讓數(shù)據(jù)點(diǎn)自動(dòng)確定聚類的數(shù)量和最佳聚類分配。親和傳播聚類可以有效地識(shí)別數(shù)據(jù)中的復(fù)雜模式,但對(duì)于大型數(shù)據(jù)集來說,計(jì)算成本也很高。

          from sklearn.cluster import AffinityPropagation

          # 用默認(rèn)參數(shù)進(jìn)行親和傳播聚類
          clustering = AffinityPropagation(affinity='precomputed').fit(correlation_mat)

          # Display the cluster labels
          print_clusters(df_combined,clustering.labels_)
          親和傳播聚類的結(jié)果

          有趣的是,這個(gè)方法發(fā)現(xiàn)四個(gè)聚類是我們數(shù)據(jù)的最佳聚類數(shù)量。此外,我們可以觀察到,石油和天然氣公司被聚在一起,一些科技公司也被聚在一起。

          方法4:DBSCAN聚類法

          DBSCAN是一種基于密度的聚類算法,它將那些緊密排列在一起的點(diǎn)聚在一起。它不需要事先指定聚類的數(shù)量,而且可以識(shí)別任意形狀的聚類。該算法對(duì)數(shù)據(jù)中的離群值和噪聲具有魯棒性,可以自動(dòng)將它們標(biāo)記為噪聲點(diǎn)。


          from sklearn.cluster import DBSCAN

          # Removing negative values in correlation matrix
          correlation_mat_pro = 1 + correlation_mat

          # Perform DBSCAN clustering with eps=0.5 and min_samples=5
          clustering = DBSCAN(eps=0.5, min_samples=5, metric='precomputed').fit(correlation_mat_pro)

          # Print the cluster labels
          print_clusters(df_combined,clustering.labels_)
          DBScan聚類的結(jié)果

          在這里,與基于親和力的聚類不同,DBScan方法將5個(gè)聚類確定為最佳數(shù)量。還可以看出,有些集群只有1或2家公司。

          可視化

          同時(shí)檢查上述四種聚類方法的結(jié)果,以深入了解它們的性能,可能是有用的。最簡(jiǎn)單的方法是使用熱圖,公司在X軸上,聚類在Y軸上。


          def plot_cluster_heatmaps(cluster_results, companies):

              # 從字典中提取key和value
              methods = list(cluster_results.keys())
              labels = list(cluster_results.values())

              # 定義每個(gè)方法的熱圖數(shù)據(jù)
              heatmaps = []
              for i in range(len(methods)):
                  heatmap = np.zeros((len(np.unique(labels[i])), len(companies)))
                  for j in range(len(companies)):
                      heatmap[labels[i][j], j] = 1
                  heatmaps.append(heatmap)

              # Plot the heatmaps in a 2x2 grid
              fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(1212))

              for i in range(len(methods)):
                  row = i // 2
                  col = i % 2
                  sns.heatmap(heatmaps[i], cmap="Blues", annot=True, fmt="g", xticklabels=companies, ax=axs[row, col])
                  axs[row, col].set_title(methods[i])

              plt.tight_layout()
              plt.show()

          companies=df_combined.columns
          plot_cluster_heatmaps(cluster_results, companies)
          所有四種方法的聚類結(jié)果

          然而,當(dāng)試圖比較多種聚類算法的結(jié)果時(shí),上述的可視化并不是很有幫助。找到一個(gè)更好的方法來表示這個(gè)圖將會(huì)很有幫助。

          結(jié)論

          在這篇文章中,我們探討了四種不同的方法,根據(jù)20家公司的股票價(jià)格之間的相關(guān)性來進(jìn)行聚類。其目的是以反映這些公司的行為而不是其股票價(jià)格的方式對(duì)其進(jìn)行聚類。嘗試了K-means聚類、Agglomerative聚類、Affinity Propagation聚類和DBSCAN聚類方法,每種方法都有自己的優(yōu)點(diǎn)和缺點(diǎn)。結(jié)果顯示,這四種方法都能以符合其行業(yè)或部門的方式對(duì)公司進(jìn)行聚類,而一些方法的計(jì)算成本比其他方法更高。基于相關(guān)性的聚類方法為基于股票價(jià)格的聚類方法提供了一個(gè)有用的替代方法,可以根據(jù)公司的行為而不是股票價(jià)格來聚類。

          編輯:王菁
          校對(duì):林亦霖

          瀏覽 1943
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爽爽一区二区三区 | 96精品久久久久久久久久 | 日韩一级在线 | 永久免费 看片视频 | 操屄小视频 |