将给定的随机值标准化为java中的0 - 1范围

时间:2017-08-23 13:30:47

标签: java java-8 range scaling normalize

假设我得到的值是当前时间的差值(以毫秒为单位) - 某个日期时间(以毫秒为单位)。

double value = Calendar.getInstance().getTimeInMillis() - getMilliseconds(reportingDt);

所以这将是一个非常大的价值。现在我想将其标准化为0 - 1。

请有人建议如何在java中实现这一点,以便我的值在0和1之间缩放。

报告越多,报告越多,报告的最终值越大,越接近0。

更新

我的正常化方法如下。这更像是一个原型,但它对我有用。

private double getDocumentScore(String reportingDt) {

        Date offset = null;
        try {
            offset = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS").parse("24-08-2017 13:53:30.802");
        } catch (ParseException e) {
            e.printStackTrace();
        } 

        long currentTime = Calendar.getInstance().getTimeInMillis(); 
        if(offset != null) {
            // If offset is set then instead of current datetime consider offset
            currentTime = offset.getTime();
        }
        System.out.println(reportingDt);
        long value = currentTime - getMilliseconds(reportingDt);

        long minutes = TimeUnit.MILLISECONDS.toMinutes(value);
        double score = 2 * (1 / Math.log(minutes));
        System.out.println(score);
        return score;
    }

    private long getMilliseconds(String dateTime) {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
        Date date = null;
        try {
            date = formatter.parse(dateTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date.getTime();
    }

样本输入日期和输出标准化分数值

11-07-2017 14:34:05.416
0.18089822028334113
11-07-2017 14:34:06.023
0.18089822028334113
11-07-2017 14:34:06.595
0.18089822028334113
11-07-2017 14:34:07.139
0.18089822028334113
11-07-2017 14:34:08.873
0.18089822028334113
11-07-2017 14:34:11.171
0.18089822028334113
11-07-2017 14:34:12.954
0.18089822028334113
11-07-2017 14:34:12.962
0.18089822028334113
11-07-2017 14:34:34.516
0.18089847869291217
11-07-2017 14:34:35.720
0.18089847869291217
11-07-2017 14:34:38.566
0.18089847869291217
11-07-2017 14:34:39.205
0.18089847869291217
11-07-2017 14:34:40.357
0.18089847869291217

以下是我认为对该值进行标准化的各种得分函数的图表。最后我用绿线一(2 *(1 / log(x)))

enter image description here

3 个答案:

答案 0 :(得分:1)

抱歉,这是不可能解决的。为什么?因为时间会继续,并且您将获得相同DateTime值的不同值,具体取决于您是否在今天,明天,一年后执行您的代码...

您必须拥有您想要观察的固定时间范围。如果你说你想从1970年1月1日到2070年1月1日,你可以简单地将你的时间跨度值除以这个最大时间跨度值。从中减去1并将结果设置为绝对值。但是这个结果只会在本世纪60年代接近1。这不是你要求的。

然后,另一方面,在逗号后面有一个带有大量数字的浮点数,而不是逗号前面有大量数字的长值,有什么用呢?

答案 1 :(得分:1)

您说过可以将所有值放在列表中并计算最小值和最大值。然后可以将每个值标准化为:

/**
 * Calculates a value between 0 and 1, given the precondition that value
 * is between min and max. 0 means value = max, and 1 means value = min.
 */
double normalize(double value, double min, double max) {
    return 1 - ((value - min) / (max - min));
}

答案 2 :(得分:0)

这样做 -

double currenttime=Calendar.getInstance().getTimeInMillis();    
double value= currenttime- getMilliseconds(reportingDt);
double normalized=(1- value/currenttime;
System.out.println(normalized);