假设我得到的值是当前时间的差值(以毫秒为单位) - 某个日期时间(以毫秒为单位)。
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)))
答案 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);