2017-08-23 11 views
-4

現在の時刻の差をミリ秒単位で取得しているとします。与えられたランダムな値をJavaの0 - 1の範囲に正規化します

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

だから、これは非常に大きな値になります。いくつかのいずれかが私の値は、より最近の0と1

の間でスケールされるように、これは、Javaで実現する方法を提案することができますしてください1.

- 今私は0のスケールに、それを正規化したいですreportingDtは、最終的な値は、1歳以上の方にreportingDtは、より多くのそれはまあ0

UPDATE

に向けて、それは以下のようにした正規化に向けた私のアプローチですよりです。これはもっとプロトタイプですが、それは私のために働いていました。

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 

たiが値を正規化すると考えられ、様々なスコア関数のグラフプロットです。最終的に私は緑のライン1を使用(2 *(1 /ログ(X)))

enter image description here

+9

好きですか?定義された範囲がなければ、正規化することができないので、まずそれについて考えることができます。 –

+0

@ OHGODSPIDERS私はすべての値を取得し、リストに入れて、最小値と最大値を見つけることができます。したがって、範囲があります。 –

+0

これは別の方法で行うことができます。さらに最近の 'reportingDt'は0に近く、1に向かっては1に向かって古いことができます.'Calendar.getInstance()。getTimeInMillis()によって最終値を分けることでできます。 –

答えて

1

申し訳ありませんが、それは解決することは不可能です。どうして?時間が移動して、今日から今日にかけてコードを実行するかどうかによって、同じDateTime値に対して異なる値が得られるからです...

あなたは観察したい。あなたが1970年1月1日から2070年1月1日に行きたいと言うなら、タイムパンの値をこの最大タイムパン値で単に割ることができます。そこから1を引いて、結果の絶対値を設定します。しかし、この結果は今世紀の60年代に限って1に近づくでしょう。それは本当にあなたが求めていたものではありません。

次に、コンマの前に多数の数字がある長い値とは対照的に、コンマの後ろに数字の多い浮動小数点数を使用するのはどうですか?

0

あなたは、すべての値をリストに入れ、最小値と最大値を計算することができます。そして、それぞれの値は次のように正規化することができる。

/** 
* 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)); 
} 
0

は、double型の値の範囲であるものthis-

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

これは 'getMilliseconds(reportingDt)/ currenttime'と同じです。負の数値(1970年より前のreportingDtの場合)から1(reportingDt = nowの場合)まで変化します。 – DodgyCodeException

関連する問題