在java中,将给定的随机值规范化为0-1的范围

在java中,将给定的随机值规范化为0-1的范围,java,java-8,range,scaling,normalize,Java,Java 8,Range,Scaling,Normalize,假设我得到一个值,该值是当前时间(以毫秒为单位)的差值-一些日期时间(以毫秒为单位) double value = Calendar.getInstance().getTimeInMillis() - getMilliseconds(reportingDt); 所以这将是一个相当大的价值。现在我想将其规格化为0-1的比例 请有人建议如何在java中实现这一点,以便我的值在0和1之间进行缩放 报告DT越近,最终值越接近1,报告DT越早,最终值越接近0 更新 我的正常化方法如下。这更像是一个原型,

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

double value = Calendar.getInstance().getTimeInMillis() - getMilliseconds(reportingDt);
所以这将是一个相当大的价值。现在我想将其规格化为0-1的比例

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

报告DT越近,最终值越接近1,报告DT越早,最终值越接近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
下面是我考虑过的用于标准化值的各种分数函数的图表。最后我使用了绿线1 2*1/logx


对不起,这是不可能解决的。为什么?因为随着时间的推移,相同的日期时间值会得到不同的值,这取决于您是否在今天、明天或一年后执行代码

你必须有一个你想要观察的固定时间范围。如果你说你想从1970年1月1日到2070年1月1日,你可以简单地用你的时间跨度值除以这个最大时间跨度值。从中减去1并将结果设置为绝对值。但这一结果只有在本世纪60年代才会接近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));
}
你喜欢这样吗-

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

这个双倍值的范围是多少?您可能需要首先考虑这一点,因为如果没有定义的范围,您无法正常化。@OHGODSPIDERS我可以获取所有值,将其放入一个列表中,然后找到最小值和最大值,这样就有了一个范围。您可以用另一种方法来做,最新的报告DT接近0,旧的报告DT接近1。您可以通过将最终值除以calendar.getInstance来实现。getTimeInMillis@a_a不,另一种方法不会让我得到我想要的东西。它必须更接近于1,而不是更接近于0。再说一次:如果你不知道关于这个双精度值的任何信息,那么你就不能对它进行规范化。假设第一次调用时该值为5000。它应该接近0还是接近1?如果第一个值是50000呢?如果不知道要规格化的值的范围,则无法进行规格化!这等于GetMillisSecondsReportingDT/currenttime。它将从1970年以前的reportingDt的负数变化到现在的reportingDt=1。