Smile
Smile (Statistical Machine Intelligence and Learning Engine) 是一个快速且全面的机器学习、自然语言处理、线性代数、图形、插值和可视化系统,支持 Java 和 Scala。通过先进的数据结构和算法,Smile 提供了最先进的性能。Smile 有详细的文档,请查看项目的 网站 获取编程指南和更多信息。
Smile 涵盖了机器学习的各个方面,包括分类、回归、聚类、关联规则挖掘、特征选择、流形学习、多维缩放、遗传算法、缺失值插补、高效的最近邻搜索等。
Smile 实现了以下主要的机器学习算法:
-
分类: 支持向量机、决策树、AdaBoost、梯度提升、随机森林、逻辑回归、神经网络、RBF 网络、最大熵分类器、KNN、朴素贝叶斯、Fisher/线性/二次/正则判别分析。
-
回归: 支持向量回归、高斯过程、回归树、梯度提升、随机森林、RBF 网络、OLS、LASSO、ElasticNet、岭回归。
-
特征选择: 基于遗传算法的特征选择、基于集成学习的特征选择、TreeSHAP、信噪比、方差比。
-
聚类: BIRCH、CLARANS、DBSCAN、DENCLUE、确定性退火、K-Means、X-Means、G-Means、神经气体、生长神经气体、层次聚类、顺序信息瓶颈、自组织映射、谱聚类、最小熵聚类。
-
关联规则和频繁项集挖掘: FP-growth 挖掘算法。
-
流形学习: IsoMap、LLE、Laplacian Eigenmap、t-SNE、UMAP、PCA、核 PCA、概率 PCA、GHA、随机投影、ICA。
-
多维缩放: 经典 MDS、单调 MDS、Sammon 映射。
-
最近邻搜索: BK-Tree、Cover Tree、KD-Tree、SimHash、LSH。
-
序列学习: 隐马尔可夫模型、条件随机场。
-
自然语言处理: 句子分割和分词、双字节统计测试、短语提取、关键词提取、词干提取、词性标注、相关性排序。
您可以通过在项目的 pom.xml 文件中添加以下内容来使用 Maven 中央库的库。
<dependency>
<groupId>com.github.haifengl</groupId>
<artifactId>smile-core</artifactId>
<version>3.1.1</version>
</dependency>
对于 NLP,请使用 artifactId smile-nlp。
对于 Scala API,请使用
libraryDependencies += "com.github.haifengl" %% "smile-scala" % "3.1.1"
对于 Kotlin API,请在 Gradle 构建脚本的 dependencies
部分添加以下内容。
implementation("com.github.haifengl:smile-kotlin:3.1.1")
对于 Clojure API,请在项目或构建文件中添加以下依赖项:
[org.clojars.haifengl/smile "3.1.1"]
一些算法依赖于 BLAS 和 LAPACK(例如流形学习、某些聚类算法、高斯过程回归、多层感知器等)。要使用这些算法,您应该包含 OpenBLAS 以进行优化的矩阵计算:
libraryDependencies ++= Seq(
"org.bytedeco" % "javacpp" % "1.5.8" classifier "macosx-x86_64" classifier "windows-x86_64" classifier "linux-x86_64" classifier "linux-arm64" classifier "linux-ppc64le" classifier "android-arm64" classifier "ios-arm64",
"org.bytedeco" % "openblas" % "0.3.21-1.5.8" classifier "macosx-x86_64" classifier "windows-x86_64" classifier "linux-x86_64" classifier "linux-arm64" classifier "linux-ppc64le" classifier "android-arm64" classifier "ios-arm64",
"org.bytedeco" % "arpack-ng" % "3.8.0-1.5.8" classifier "macosx-x86_64" classifier "windows-x86_64" classifier "linux-x86_64" classifier "linux-arm64" classifier "linux-ppc64le"
)
在此示例中,我们包括所有受支持的 64 位平台,并过滤掉 32 位平台。用户应仅包括所需的平台以节省空间。
如果您更喜欢其他 BLAS 实现,您可以通过指定 "org.bytedeco.openblas.load" 系统属性,使用在 "java.library.path" 或类路径上找到的任何库。例如,要使用 Mac OS X 上 Accelerate 框架中的 BLAS 库,我们可以传递 -Dorg.bytedeco.openblas.load=blas
等选项。
如果您有 MKL 的默认安装,或者只需包含以下模块(这些模块包含完整版本的 MKL 二进制文件),Smile 将自动切换到 MKL。
libraryDependencies ++= {
val version = "2024.0-1.5.10"
Seq(
"org.bytedeco" % "mkl-platform" % version,
"org.bytedeco" % "mkl-platform-redist" % version
)
}
Shell
Smile 提供了用于 Java、Scala 和 Kotlin 的交互式 Shell。请从 发布页面 下载预打包的 Smile。在 Smile 的主目录中,输入
./bin/smile
进入 Scala Shell。您可以在 Shell 中运行任何有效的 Scala 表达式。在最简单的情况下,您可以将其用作计算器。此外,所有高级 Smile 操作符都已在 Shell 中预定义。默认情况下,Shell 使用高达 75% 的内存。如果您需要更多内存来处理大型数据,请使用 -J-Xmx
或 -XX:MaxRAMPercentage
选项。例如,
./bin/smile -J-Xmx30G
您还可以修改配置文件 ./conf/smile.ini
以设置内存和其他 JVM 设置。
要使用 Java 的 JShell,请输入
./bin/jshell.sh
该命令在类路径中包含 Smile 的 jar。同样地,运行
./bin/kotlin.sh
进入 Kotlin REPL。
模型序列化
大多数模型支持 Java 的 Serializable
接口(所有分类器都支持 Serializable
接口),因此您可以在 Spark 中使用它们。Protostuff 是一个很好的替代方案,支持前向后向兼容性(模式演化)和验证。除了 XML 之外,Protostuff 还支持许多其他格式,例如 JSON、YAML、protobuf 等。
可视化
Smile 提供了一个基于 Swing 的数据可视化库 SmilePlot,支持散点图、线形图、阶梯图、条形图、箱线图、直方图、3D 直方图、树状图、热图、六边形图、QQ 图、等高线图、表面和线框图。 要使用 SmilePlot,请将以下内容添加到依赖项中:
<dependency>
<groupId>com.github.haifengl</groupId>
<artifactId>smile-plot</artifactId>
<version>3.1.1</version>
</dependency>
Smile 还支持以声明式方式进行数据可视化。
使用 smile.plot.vega
包,我们可以创建一个描述可视化的规范,将数据映射到图形标记的属性(例如点或条形)。该规范基于 Vega-Lite。Vega-Lite 编译器会自动生成可视化组件,包括轴、图例和比例尺。然后,它根据一组精心设计的规则确定这些组件的属性。