您好,登錄后才能下訂單哦!
今天小編給大家分享一下Python怎么使用樹狀圖實現可視化聚類的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
樹狀圖是顯示對象、組或變量之間的層次關系的圖表。樹狀圖由在節點或簇處連接的分支組成,它們代表具有相似特征的觀察組。分支的高度或節點之間的距離表示組之間的不同或相似程度。也就是說分支越長或節點之間的距離越大,組就越不相似。分支越短或節點之間的距離越小,組越相似。
樹狀圖對于可視化復雜的數據結構和識別具有相似特征的數據子組或簇很有用。它們通常用于生物學、遺傳學、生態學、社會科學和其他可以根據相似性或相關性對數據進行分組的領域。
背景知識:
“樹狀圖”一詞來自希臘語“dendron”(樹)和“gramma”(繪圖)。1901年,英國數學家和統計學家卡爾皮爾遜用樹狀圖來顯示不同植物種類之間的關系[1]。他稱這個圖為“聚類圖”。這可以被認為是樹狀圖的首次使用。
我們將使用幾家公司的真實股價來進行聚類。為了方便獲取,所以使用 Alpha Vantage 提供的免費 API 來收集數據。Alpha Vantage同時提供免費 API 和高級 API,通過API訪問需要密鑰,請參考他的網站。
import pandasaspd 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={} forkey,valueincompanies.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)'indataanddata['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 fordf_key, dfinall_data.items(): ifcommon_datesisNone: 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 fordf_key, dfinall_data.items(): df_combined=pd.concat([df_combined, df.reindex(common_dates)], axis=1)
將上面的數據整合成我們需要的DF,下面就可以直接使用了
層次聚類(Hierarchical clustering)是一種用于機器學習和數據分析的聚類算法。它使用嵌套簇的層次結構,根據相似性將相似對象分組到簇中。該算法可以是聚集性的可以從單個對象開始并將它們合并成簇,也可以是分裂的,從一個大簇開始并遞歸地將其分成較小的簇。
需要注意的是并非所有聚類方法都是層次聚類方法,只能在少數聚類算法上使用樹狀圖。
聚類算法我們將使用 scipy 模塊中提供的層次聚類。
1、自上而下聚類
import numpyasnp import scipy.cluster.hierarchyassch import matplotlib.pyplotasplt # 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 numpyasnp import scipy.cluster.hierarchyassch import matplotlib.pyplotasplt # 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()
我們為自下而上的聚類獲得的樹狀圖類似于自上而下的聚類。最佳簇數仍然是兩個(基于顏色數和“拐點”方法)。但是如果我們需要更多的集群,就會觀察到一些細微的差異。這也很正常,因為使用的方法不一樣,導致結果會有一些細微的差異。
以上就是“Python怎么使用樹狀圖實現可視化聚類”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。