Browse Source

归一化算法,增加基于边界值的部分值列表计算

master
wxz 5 years ago
parent
commit
8754dc9352
  1. 25
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/DoubleScoreCalculator.java
  2. 37
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/IntegerScoreCalculator.java
  3. 44
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/ScoreCalculator.java
  4. 66
      epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/stats/test/normalizing/DemoScoreCal.java

25
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/DoubleScoreCalculator.java

@ -22,7 +22,7 @@ public class DoubleScoreCalculator extends ScoreCalculator {
this.minScore = minScore;
this.maxScore = maxScore;
this.correlation = correlation;
this.prepare();
this.prepare4SourceArray();
}
public DoubleScoreCalculator(List<Double> sourceArray, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) {
@ -30,7 +30,28 @@ public class DoubleScoreCalculator extends ScoreCalculator {
this.minScore = minScore;
this.maxScore = maxScore;
this.correlation = correlation;
this.prepare();
this.prepare4SourceArray();
}
/**
* 初始化基于边界值的整数分值计算
* @param minSourceValue 左边界值
* @param maxSourceValue 右边界值
* @param minScore 分值区间的左边界
* @param maxScore 分值区间的右边界
* @param correlation 相关性
*/
public DoubleScoreCalculator(Double minSourceValue, Double maxSourceValue, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) {
BigDecimal minSourceValueBD = new BigDecimal(minSourceValue);
BigDecimal maxSourceValueBD = new BigDecimal(maxSourceValue);
this.minScore = minScore;
this.maxScore = maxScore;
this.minValue = minSourceValueBD;
this.maxValue = maxSourceValueBD;
this.correlation = correlation;
prepare4BoundaryValue();
System.out.println("最小值:"+minScore+";最大值:"+maxScore);
}
@Override

37
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/IntegerScoreCalculator.java

@ -10,9 +10,9 @@ import java.util.List;
public class IntegerScoreCalculator extends ScoreCalculator {
/**
* 初始化整数分值计算
* 初始化基于原数组的整数分值计算
* 务必在该构造方法最后调用父类的prepare()方法
* @param sourceArray 数据所在的数组
* @param sourceArray 源数据完整数组
* @param minScore 分值区间的左边界
* @param maxScore 分值区间的右边界
* @param correlation 相关性
@ -22,17 +22,44 @@ public class IntegerScoreCalculator extends ScoreCalculator {
this.minScore = minScore;
this.maxScore = maxScore;
this.correlation = correlation;
this.prepare();
prepare4SourceArray();
System.out.println("最小值:"+minScore+";最大值:"+maxScore);
}
/**
* 初始化基于原数组的整数分值计算
* @param sourceList 源数据完整列表
* @param minScore 分值区间的左边界
* @param maxScore 分值区间的右边界
* @param correlation 相关性
*/
public IntegerScoreCalculator(List<Integer> sourceList, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) {
this.sourceArrary = sourceList.toArray();
this.minScore = minScore;
this.maxScore = maxScore;
this.correlation = correlation;
this.prepare();
prepare4SourceArray();
System.out.println("最小值:"+minScore+";最大值:"+maxScore);
}
/**
* 初始化基于边界值的整数分值计算
* @param minSourceValue 左边界值
* @param maxSourceValue 右边界值
* @param minScore 分值区间的左边界
* @param maxScore 分值区间的右边界
* @param correlation 相关性
*/
public IntegerScoreCalculator(Integer minSourceValue, Integer maxSourceValue, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) {
BigDecimal minSourceValueBD = new BigDecimal(minSourceValue);
BigDecimal maxSourceValueBD = new BigDecimal(maxSourceValue);
this.minScore = minScore;
this.maxScore = maxScore;
this.minValue = minSourceValueBD;
this.maxValue = maxSourceValueBD;
this.correlation = correlation;
prepare4BoundaryValue();
System.out.println("最小值:"+minScore+";最大值:"+maxScore);
}

44
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/ScoreCalculator.java

@ -1,5 +1,7 @@
package com.epmet.support.normalizing;
import lombok.Data;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.Arrays;
@ -11,23 +13,40 @@ import java.util.stream.Collectors;
* 如果需要保持传入的数组元素顺序不变请在实现类的构造方法中将传入数组进行克隆
* @param <T> 数据类型泛型
*/
@Data
public abstract class ScoreCalculator<T> {
/**
* 源数据的数组
*/
protected T[] sourceArrary;
/**
* 最大最小分
*/
protected BigDecimal minScore;
protected BigDecimal maxScore;
/**
* 相关性
*/
protected Correlation correlation;
private BigDecimal maxValue;
private BigDecimal minValue;
/**
* 系数
*/
private BigDecimal coefficient;
/**
* 计算准备
* 最大最小值
*/
protected void prepare() {
protected BigDecimal maxValue;
protected BigDecimal minValue;
/**
* 计算准备基于sourceArray方式的
*/
public void prepare4SourceArray() {
// 校验数组
if (!validSourceArray(sourceArrary)) {
throw new RuntimeException("入参数组错误:请设置非空数组");
@ -37,7 +56,14 @@ public abstract class ScoreCalculator<T> {
minValue = getMinFromSourceArray();
//计算系数
System.out.println("最小值:"+minScore+";最大值:"+maxScore);
coefficient = getCoefficient(minValue, maxValue);
coefficient = calcuteCoefficient(minValue, maxValue);
}
/**
* 计算准备基于边界值的
*/
public void prepare4BoundaryValue() {
coefficient = calcuteCoefficient(minValue, maxValue);
}
/**
@ -50,10 +76,6 @@ public abstract class ScoreCalculator<T> {
throw new RuntimeException("入参数组错误:请设置sourceValue");
}
if (!Arrays.asList(sourceArrary).contains(sourceValue)) {
throw new RuntimeException("请确认要计算的数组在数组中存在");
}
if (correlation == Correlation.POSITIVE) {
// 正相关
BigDecimal x = coefficient.multiply(convertValue2BigDecimal(sourceValue).subtract(minValue));
@ -95,6 +117,8 @@ public abstract class ScoreCalculator<T> {
return scores;
}
//---------------------批量-------------------------
/**
* 批量归一算法返回List
* @param sourceValues
@ -147,7 +171,7 @@ public abstract class ScoreCalculator<T> {
* 计算系数
* @return
*/
protected BigDecimal getCoefficient(BigDecimal min, BigDecimal max) {
protected BigDecimal calcuteCoefficient(BigDecimal min, BigDecimal max) {
BigDecimal fenmu = max.subtract(min);
if (fenmu.toString().equals("0"))return new BigDecimal(0);
BigDecimal fenzi = maxScore.subtract(minScore);

66
epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/stats/test/normalizing/DemoScoreCal.java

@ -0,0 +1,66 @@
package com.epmet.stats.test.normalizing;
import com.epmet.support.normalizing.Correlation;
import com.epmet.support.normalizing.DoubleScoreCalculator;
import com.epmet.support.normalizing.IntegerScoreCalculator;
import com.epmet.support.normalizing.ScoreCalculator;
import java.math.BigDecimal;
import java.util.Arrays;
public class DemoScoreCal {
public static void main(String[] args) {
//demoInteger();
demoIntegerPartical();
//demoDouble();
}
/**
* 整数类型,完整源数据列表的归一算法
*/
public static void demoInteger() {
Integer[] iArray = {4,8,1,3,2};
BigDecimal minScore = new BigDecimal(5);
BigDecimal maxScore = new BigDecimal(10);
ScoreCalculator sc = new IntegerScoreCalculator(iArray, minScore, maxScore, Correlation.NEGATIVE);
BigDecimal[] scores = sc.normalize(iArray);
Arrays.stream(scores).forEach(s -> System.out.println(s));
}
/**
* 整数类型,基于边界值的部分列表的的归一算法
*/
public static void demoIntegerPartical() {
Integer[] iArray = {4,1,2};
BigDecimal minScore = new BigDecimal(5);
BigDecimal maxScore = new BigDecimal(10);
ScoreCalculator sc = new IntegerScoreCalculator(1, 8 ,minScore, maxScore, Correlation.NEGATIVE);
BigDecimal[] scores = sc.normalize(iArray);// 此处也可以直接使用list参数的重载方法,计算阶段没有任何区别,区别在于new IntegerScoreCalculator()阶段
Arrays.stream(scores).forEach(s -> System.out.println(s));
}
/**
* double类型归一算法
*/
public static void demoDouble() {
Double[] iArray = {1.9,8.9,1.0,3.0,2.0};
BigDecimal minScore = new BigDecimal(5);
BigDecimal maxScore = new BigDecimal(10);
ScoreCalculator sc = new DoubleScoreCalculator(iArray, minScore, maxScore, Correlation.POSITIVE);
BigDecimal normalize = sc.normalize(3.0);
System.out.println(normalize);
/**
* 同一组数据内只有被计算值变了的话不需要重新new对象直接重复调用即可
*/
BigDecimal normalize2 = sc.normalize(2.0);
System.out.println(normalize2);
}
}
Loading…
Cancel
Save