正如我在之前的部落格文章中所展示的那樣,使用 Python 整合 JMP 的優勢在於,您可以使用 Python 套件來存取 JMP 中未包含的功能和分析方法。
這次,我們將以JMP為例,介紹如何使用Python整合來實現基於密度的聚類方法HDBSCAN。雖然JMP擁有諸如k-means之類的聚類分析方法,但它本身並沒有內建HDBSCAN。
此外,它還可以與上次介紹的對話方塊結合使用。該對話方塊還允許您指定變數(列)。換句話說,您可以即時選擇用於聚類的變量,指定參數值,然後執行該過程。 HDBSCAN 的使用體驗幾乎與 JMP 分析平台相同。
ダイアログによるHDBSCANの実行透過對話框運行 HDBSCAN
HDBSCAN是什麼?
HDBSCAN 是一種透過專注於資料的「密度」來尋找聚類的方法。它將資料點密集聚集的區域視為一個單獨的聚類,並以低密度區域作為邊界來劃分資料。
HDBSCAN 不需要您預先指定聚類數量,它會根據資料自動決定。另一個主要特點是能夠將異常值識別為雜訊。在諸如 k-means 之類的聚類方法中,異常值總是被歸類到指定的某個聚類中。相較之下,HDBSCAN 將不屬於任何聚類的點視為雜訊。
與其指定聚類的數量,不如使用兩個參數來決定「一個區域的人口密度要達到多少才能被視為一個聚類」。
最小聚類大小 :要辨識為一個聚類的最小資料點數。
小於此值的群體不被視為聚類。增加此值往往會導致聚類數量減少,因為較小的聚類不再被識別。
最小樣本數 :測量密度時要參考的相鄰點的數量。
該值越大,密度判定越保守,包含的雜訊(-1)就越多。可以將其理解為指定異常值檢測的嚴格程度。
基於 Python 的程式碼 (.py)
在建立對話方塊之前,讓我們先使用基於 Python 的方法 (.py) 來撰寫 HDBSCAN 部分。
使用隨機數建立的範例資料「HDBSCAN_sample.jmp」(1,000 行,6 列連續尺度數據,附在本部落格中),開啟並執行 .py 檔案(Example2_HDBSCAN.py)將使用「X1」到「X6」執行 HDBSCAN。
以下是程式碼的主要部分。它將 JMP 列“X1”到“X6”轉換為 pandas DataFrame(一種表格資料結構),標準化數據,然後執行 THDBSCAN。
Pythonを起点としたコード基於 Python 的程式碼
*此程式碼需要預先在 JMP Python 環境中安裝scikit-learn和hdbscan 。
運行後,將在資料表中新增三列。
- 聚類:儲存該值所屬的聚類編號(標稱尺度)。 -1 表示雜訊(異常值),不屬於任何聚類。
- 聚類機率 :這表示屬於某個聚類的強度(0-1)。雖然它通常被翻譯為“屬於該聚類的機率”,但更準確地說,值越接近 1 表示位於聚類的核心,而值越接近 0 表示靠近聚類的邊界。
- 異常值得分:一個介於 0 到 1 之間的分數,用於表示物件相對於周圍環境密度的孤立程度。分數越高,表示該物件越可能是異常值。
データテーブルにクラスタリングの結果を追加將聚類結果新增至資料表。
使用 JMP 進行探索性分析
接下來,我們將使用 JMP 的各項功能。首先,透過在資料表中按聚類對標記進行顏色編碼([行] > [顏色/按列值著色]),您將能夠在其他分析中一目了然地看到各組之間的差異。
當我們進行主成分分析並查看得分圖時,我們可以看到三個聚類明顯分開,紅色(-1)點分散在每個組別之外。
主成分分析とクラスタリングの結果主成分分析和聚類結果
使用 [多元] > [多元相關性] 進行多元異常值分析表明,該數據是偽模擬數據。馬氏距離圖中按行號清晰的顏色分離是由於資料是分組產生的。
Mahalanobisの距離馬氏距離
使用對話方塊建立通用工具(.jsl)。
到目前為止,程式碼中變數“X1”到“X6”都是固定的,參數值直接寫入程式碼。如果要使用不同的數據,每次都需要重新編寫程式碼。
因此,我們將使用對話方塊允許使用者選擇列並指定最小元素數。由於對話方塊只能使用 JSL 創建,因此以下程式碼(Example2_HDBSCAN.jsl)將使用 JSL 編寫。主要有兩點要注意。
1. 對話部分
- 列列錶框(全部,…) :在對話方塊中顯示資料表的所有列(左側為清單)。
- 列列錶框(數值型,…) :此清單將接收選定的列(右側的清單)。指定「數值型」表示僅接受數值型列。
- 按鈕框(" > ") : 將左側清單中目前選定的欄位新增至右側清單。
// ダイアログの起動
nw = New Window( "HDBSCAN Settings",
<
<MODAL>
= 2 ), V List Box( H List Box( Panel Box( "Columns", srcList = Col List Box( All, width( 180 ), nlines( 12 ) ) ), V Center Box( Button Box( " > ", xList << Append( srcList << Get Selected ) ) ), Panel Box( "Variables for HDBSCAN", xList = Col List Box( Numeric, Min Items( 2 ), width( 180 ), nlines( 12 ) ) ) ), Panel Box( "Parameters", H List Box( Text Box( "min_cluster_size " ), mcsBox = Number Edit Box( 30, 5 ), Spacer Box( Size( 24, 0 ) ), Text Box( "min_samples " ), msBox = Number Edit Box( 10, 5 ) ) ), Button Box( "OK", selCols = xList << Get Items; mcsV = mcsBox << Get; msV = msBox << Get; ) ) );
</MODAL>
2. 接收 Python 結果並將其新增為一列。
ダイアログで選択した列やパラメータの情報を、Python Send() を使ってPythonに送付します。Python側では、この変数を使ってhdbscanパッケージによるクラスタリングを実行します。
Python Send( selCols );
Python Send( mcsV );
Python Send( msV );
この後の <EM>Python Get()</EM> は Python Send() の逆で、Python側の変数をJSLに取り込みます。これにより、JMPのデータテーブルに新しい列が作成できます。
// Python結果の受け取り、列の追加
labs = Python Get( labels );
prb = Python Get( probs );
outs = Python Get( outliers );
cCol = dt << New Column( "Cluster", Numeric, Nominal, Set Values( Matrix( labs ) ) );
pCol = dt << New Column( "Cluster_Prob", Numeric, Continuous, Set Values( Matrix( prb ) ) );
oCol = dt << New Column( "Outlier_Score", Numeric, Continuous, Set Values( Matrix( outs ) ) );
當您在「HDBSCAN_sample.jmp」上執行此 JSL 程式碼時,將出現一個對話框,讓您只對四個變數進行聚類,例如「X2」、「X3」、「X4」和「X5」。
透過新增對話框,可以將相同的腳本應用於其他資料。我們將使用 JMP 範例資料“Powder Metallurgy.jmp”中的五個連續變數“P1”到“P5”,將最小行數改為 300,最小樣本數改為 30。
HDBSCANのオプション設定HDBSCAN 選項設定
點選【確定】按鈕將顯示主成分分析報告及其他相關資訊。
別のデータにおけるレポート其他數據中的報告
如本例所示,JMP 中不支援的計算處理方法由 Python 套件完成,而結果的解釋和分析則在 JMP 中完成。這些操作隨後被整合到一個對話框中,允許使用者自由選擇變數。這樣,就可以建立一個可供 JMP 使用者使用的通用工具。
全部 4 個部分的總結
在四篇文章中,我們透過兩個具體的例子解釋了「您可以使用 JMP 的 Python 整合功能實際做什麼」:從世界銀行獲取資料並使用 HDBSCAN 進行聚類。
這些例子共同點在於,JMP 中未包含的功能和分析方法都留給了 Python 套件,而結果則使用 JMP 的資料表和報告進行探索和視覺化。
此外,透過將條件和變數規格分組到一個 JSL 對話方塊中,它變成了一個多功能的工具,任何人都可以重複使用而無需重寫程式碼。JMP 的 Python 整合最大的優勢在於,它結合了 Python 和 JMP 的優勢,從而可以擴大分析範圍。
如今,你只要告訴人工智慧你想做什麼,它就能為你寫 Python 程式碼。我們希望本系列文章能為你在 JMP 框架中使用這些產生的程式碼提供一些幫助。
最後,我想分享一段影片(日文),它在大約 12 分鐘內總結了本部落格系列(全部 4 部分)的內容。
作者:Naohiro Masukawa(JMP 日本)
Naohiro Masukawa - JMP 使用者社區