【问题标题】:Normalization of a dataset in JavaJava中数据集的规范化
【发布时间】:2015-08-21 05:19:52
【问题描述】:

我正在开发一个聚类程序,并且有一个双精度数据集,我需要对其进行规范化,以确保每个双精度(变量)具有相同的影响。

我想使用 min-max 标准化,其中为每个变量确定最小值和最大值,但我不确定如何在 Java 中的数据集上实现这一点。有人有什么建议吗?

【问题讨论】:

  • 您可以在此处添加任何示例代码吗?就目前而言,您的问题有点含糊,无法回答。

标签: java double cluster-computing normalization


【解决方案1】:

Encog Project wiki 给出了一个 utility class 进行范围标准化。

构造函数获取输入和标准化数据的高值和低值。

/**
     * Construct the normalization utility, allow the normalization range to be specified.
     * @param dataHigh The high value for the input data.
     * @param dataLow The low value for the input data.
     * @param dataHigh The high value for the normalized data.
     * @param dataLow The low value for the normalized data. 
     */
    public NormUtil(double dataHigh, double dataLow, double normalizedHigh, double normalizedLow) {
        this.dataHigh = dataHigh;
        this.dataLow = dataLow;
        this.normalizedHigh = normalizedHigh;
        this.normalizedLow = normalizedLow;

然后您可以对样本使用normalize 方法。

/**
 * Normalize x.
 * @param x The value to be normalized.
 * @return The result of the normalization.
 */
public double normalize(double x) {
    return ((x - dataLow) 
            / (dataHigh - dataLow))
            * (normalizedHigh - normalizedLow) + normalizedLow;
}

要查找数据集的最小值和最大值,请使用此问题的一个答案:Finding the max/min value in an array of primitives using Java

【讨论】:

  • 谢谢@OrtomalaLokni,它帮助了我
  • @OrtomalaLokni - 我知道这个答案已经有一段时间了,但我不明白你如何获得 normalizeHigh 和 normalizeLow 并将其用于规范化?当然,您只有在标准化后才会知道这些值?谢谢。
  • 您必须自己定义这些值,默认情况下您会选择 0 和 1,但根据您的应用程序,您可以选择不同的值。
【解决方案2】:

您可以很好地使用 apache.commons.math3 库中的 StatUtils.normalize 方法

参考以下文档 https://commons.apache.org/proper/commons-math/javadocs/api-3.4/org/apache/commons/math3/stat/StatUtils.html#normalize(double[])

Gradle依赖如下

implementation 'org.apache.commons:commons-math3:3.6.1'

Maven 依赖

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

例子

     public static void main(String[] args) {
            double[] arr = new double[]{900.68, 900.63, 900.74, 900.59, 900.49, 900.65, 900.81, 900.82, 901.03, 900.74, 900.66, 900.49, 900.52, 900.63, 900.45};
            double normArr[] = StatUtils.normalize(arr);
            for (int i = 0; i < normArr.length; i++) {
                System.out.print(normArr[i] + ", ");
            }
}

此将打印出的值:0.11787856446848383,-0.20956189238965656,0.5108071126989968,-0.47151425787616885,-1.1263951715931941,-0.0785857096464004,0.9692237523003934,1.034711843672766,2.4099617624777,0.5108071126989968,-0.013097618274772323,-1.1263951715931941,-0.9299308974783099,-0.20956189238965656,-1.3883475370797065

【讨论】:

  • 请注意,它是 StatUtils 不是 StatsUtils,我浪费了 3 分钟。
猜你喜欢
  • 2020-05-29
  • 2019-03-27
  • 2010-10-06
  • 2023-03-26
  • 2021-03-09
  • 2014-09-06
  • 2018-12-12
  • 2022-08-17
  • 2013-12-11
相关资源
最近更新 更多