使用樹狀圖可視化聚類
一般情況下,我們都是使用散佈圖進行聚類視覺化,但是某些的聚類演算法視覺化時散點圖並不理想,所以在這篇文章中,我們介紹如何使用樹狀圖( Dendrograms)對我們的聚類結果進行視覺化。
樹狀圖
樹狀圖是顯示物件、群組或變數之間的層次關係的圖表。樹狀圖由在節點或簇處連接的分支組成,它們代表具有相似特徵的觀察組。分支的高度或節點之間的距離表示群組之間的不同或相似程度。也就是說分支越長或節點之間的距離越大,組就越不相似。分支越短或節點之間的距離越小,組越相似。
樹狀圖對於可視化複雜的資料結構和識別具有相似特徵的資料子組或簇很有用。它們通常用於生物學、遺傳學、生態學、社會科學和其他可以根據相似性或相關性對數據進行分組的領域。
背景知識:
「樹狀圖」一詞來自希臘文「dendron」(樹)和「gramma」(繪圖)。 1901年,英國數學家和統計學家卡爾皮爾遜以樹狀圖顯示不同植物種類之間的關係。他稱這個圖為「聚類圖」。這可以被認為是樹狀圖的首次使用。
資料準備
我們將使用幾家公司的真實股價來進行聚類。為了方便獲取,所以使用 Alpha Vantage 提供的免費 API 來收集資料。 Alpha Vantage同時提供免費 API 和進階 API,透過API存取需要金鑰,請參考他的網站。
import pandas as pd import requests companies={'Apple':'AAPL','Amazon':'AMZN','Facebook':'META','Tesla':'TSLA','Alphabet (Google)':'GOOGL','Shell':'SHEL','Suncor Energy':'SU', 'Exxon Mobil Corp':'XOM','Lululemon':'LULU','Walmart':'WMT','Carters':'CRI','Childrens Place':'PLCE','TJX Companies':'TJX', 'Victorias Secret':'VSCO','MACYs':'M','Wayfair':'W','Dollar Tree':'DLTR','CVS Caremark':'CVS','Walgreen':'WBA','Curaleaf':'CURLF'}
科技、零售、石油和天然氣以及其他行業中挑選了 20 家公司。
import time all_data={} for key,value in companies.items(): # Replace YOUR_API_KEY with your Alpha Vantage API key url = f'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol={value}&apikey=<YOUR_API_KEY>&outputsize=full' response = requests.get(url) data = response.json() time.sleep(15) if 'Time Series (Daily)' in data and data['Time Series (Daily)']: df = pd.DataFrame.from_dict(data['Time Series (Daily)'], orient='index') print(f'Received data for {key}') else: print("Time series data is empty or not available.") df.rename(columns = {'1. open':key}, inplace = True) all_data[key]=df[key]
在上面的程式碼在 API 呼叫之間設定了 15 秒的暫停,這樣可以保證不會因為太頻繁而被封鎖。
# find common dates among all data frames common_dates = None for df_key, df in all_data.items(): if common_dates is None: common_dates = set(df.index) else: common_dates = common_dates.intersection(df.index) common_dates = sorted(list(common_dates)) # create new data frame with common dates as index df_combined = pd.DataFrame(index=common_dates) # reindex each data frame with common dates and concatenate horizontally for df_key, df in all_data.items(): df_combined = pd.concat([df_combined, df.reindex(common_dates)], axis=1)
將上面的資料整合成我們需要的DF,下面就可以直接使用了
層次聚類
層次聚類(Hierarchical clustering)是一種用於機器學習和資料分析的聚類演算法。它使用嵌套簇的層次結構,根據相似性將相似物件分組到簇中。該演算法可以是聚集性的可以從單一物件開始並將它們合併成簇,也可以是分裂的,從一個大簇開始並遞歸地將其分成較小的簇。
要注意的是並非所有聚類方法都是層次聚類方法,只能在少數聚類演算法上使用樹狀圖。
聚類演算法我們將使用 scipy 模組中提供的層次聚類。
1、自上而下聚類
import numpy as np import scipy.cluster.hierarchy as sch import matplotlib.pyplot as plt # Convert correlation matrix to distance matrix dist_mat = 1 - df_combined.corr() # Perform top-down clustering clustering = sch.linkage(dist_mat, method='complete') cuts = sch.cut_tree(clustering, n_clusters=[3, 4]) # Plot dendrogram plt.figure(figsize=(10, 5)) sch.dendrogram(clustering, labels=list(df_combined.columns), leaf_rotation=90) plt.title('Dendrogram of Company Correlations (Top-Down Clustering)') plt.xlabel('Companies') plt.ylabel('Distance') plt.show()
#如何根據樹狀圖確定最佳簇數
找到最佳簇數的最簡單方法是查看生成的樹狀圖中使用的顏色數。最佳簇的數量比顏色的數量少一個就可以了。所以根據上面這個樹狀圖,最佳聚類的數量是兩個。
另一種找到最佳簇數的方法是辨識簇間距離突然變化的點。這稱為“拐點”或“肘點”,可用於確定最能捕捉資料變化的聚類數量。上面圖中我們可以看到,不同數量的簇之間的最大距離變化發生在 1 和 2 個簇之間。因此,再一次說明最佳簇數是兩個。
從樹狀圖中取得任意數量的簇
使用樹狀圖的一個優點是可以透過查看樹狀圖將物件聚類到任意數量的簇中。例如,需要找到兩個聚類,可以查看樹狀圖上最頂部的垂直線並決定聚類。例如在這個例子中,如果需要兩個簇,那麼第一個簇中有四家公司,第二個集群中有 16 個公司。如果我們需要三個簇就可以將第二個簇進一步拆分為 11 個和 5 個公司。如果需要的更多可以依序類推。
2、自下而上聚類
import numpy as np import scipy.cluster.hierarchy as sch import matplotlib.pyplot as plt # Convert correlation matrix to distance matrix dist_mat = 1 - df_combined.corr() # Perform bottom-up clustering clustering = sch.linkage(dist_mat, method='ward') # Plot dendrogram plt.figure(figsize=(10, 5)) sch.dendrogram(clustering, labels=list(df_combined.columns), leaf_rotation=90) plt.title('Dendrogram of Company Correlations (Bottom-Up Clustering)') plt.xlabel('Companies') plt.ylabel('Distance') plt.show()
#我們為由下而上的聚類別所獲得的樹狀圖類似於自上而下的聚類。最佳簇數仍然是兩個(基於顏色數和“拐點”方法)。但是如果我們需要更多的集群,就會觀察到一些細微的差異。這也很正常,因為使用的方法不一樣,導致結果會有一些細微的差異。
總結
樹狀圖是可視化複雜資料結構和識別具有相似特徵的資料子群組或簇的有用工具。在本文中,我們使用層次聚類方法來示範如何建立樹狀圖以及如何確定最佳聚類數。對於我們的資料樹狀圖有助於理解不同公司之間的關係,但它們也可以用於其他各種領域,以理解資料的層次結構。
以上是使用樹狀圖可視化聚類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

這個AI輔助程式工具在這個AI快速發展的階段,挖掘出了一大批好用的AI輔助程式工具。 AI輔助程式設計工具能夠提升開發效率、提升程式碼品質、降低bug率,是現代軟體開發過程中的重要助手。今天大姚給大家分享4款AI輔助程式工具(而且都支援C#語言),希望對大家有幫助。 https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot是一款AI編碼助手,可幫助你更快、更省力地編寫程式碼,從而將更多精力集中在問題解決和協作上。 Git

2022年3月3日,距離世界首個AI程式設計師Devin誕生不足一個月,普林斯頓大學的NLP團隊開發了一個開源AI程式設計師SWE-agent。它利用GPT-4模型在GitHub儲存庫中自動解決問題。 SWE-agent在SWE-bench測試集上的表現與Devin相似,平均耗時93秒,解決了12.29%的問題。 SWE-agent透過與專用終端交互,可以開啟、搜尋文件內容,使用自動語法檢查、編輯特定行,以及編寫和執行測試。 (註:以上內容為原始內容微調,但保留了原文中的關鍵訊息,未超過指定字數限制。)SWE-A

Go語言開發行動應用程式教學隨著行動應用程式市場的不斷蓬勃發展,越來越多的開發者開始探索如何利用Go語言開發行動應用程式。作為一種簡潔高效的程式語言,Go語言在行動應用開發中也展現了強大的潛力。本文將詳細介紹如何利用Go語言開發行動應用程序,並附上具體的程式碼範例,幫助讀者快速入門並開始開發自己的行動應用程式。一、準備工作在開始之前,我們需要準備好開發環境和工具。首

五大熱門Go語言庫總結:開發必備利器,需要具體程式碼範例Go語言自從誕生以來,受到了廣泛的關注和應用。作為一門新興的高效、簡潔的程式語言,Go的快速發展離不開豐富的開源程式庫的支援。本文將介紹五大熱門的Go語言庫,這些庫在Go開發中扮演了至關重要的角色,為開發者提供了強大的功能和便利的開發體驗。同時,為了更好地理解這些庫的用途和功能,我們會結合具體的程式碼範例進行講

Kafka視覺化工具的五種選擇ApacheKafka是一個分散式串流處理平台,能夠處理大量即時資料。它廣泛用於建立即時資料管道、訊息佇列和事件驅動的應用程式。 Kafka的視覺化工具可以幫助使用者監控和管理Kafka集群,並且更好地理解Kafka資料流。以下是對五種流行的Kafka視覺化工具的介紹:ConfluentControlCenterConfluent

Android開發是一項繁忙而又令人興奮的工作,而選擇適合的Linux發行版來進行開發則顯得尤為重要。在眾多的Linux發行版中,究竟哪一個最適合Android開發呢?本文將從幾個方面來探討這個問題,並給出具體的程式碼範例。首先,我們來看看目前流行的幾個Linux發行版:Ubuntu、Fedora、Debian、CentOS等,它們都有各自的優點和特點。

Go語言作為一種快速、高效的程式語言,在後端開發領域廣受歡迎。然而,很少有人將Go語言與前端開發聯繫起來。事實上,使用Go語言進行前端開發不僅可以提高效率,還能為開發者帶來全新的視野。本文將探討使用Go語言進行前端開發的可能性,並提供具體的程式碼範例,幫助讀者更了解這一領域。在傳統的前端開發中,通常會使用JavaScript、HTML和CSS來建立使用者介面

《了解VSCode:這款工具到底是用來做什麼的? 》身為程式設計師,無論是初學者或資深開發者,都離不開程式碼編輯工具的使用。在眾多編輯工具中,VisualStudioCode(簡稱VSCode)作為一款開源、輕量級、強大的程式碼編輯器備受開發者歡迎。那麼,VSCode到底是用來做什麼的呢?本文將深入探討VSCode的功能和用途,並提供具體的程式碼範例,以幫助讀者
