正如我在之前的博客文章中展示的那样,使用 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(一种表格数据结构),对数据进行标准化,然后运行 HDBSCAN。
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 用户社区