包裹分箱 算法

包裹 分箱简单算法 算出临界值 分箱数量加1
/**
*预估分箱算法
* @return
*/
  private Tuple2<BigDecimal,Integer>  calculateFareAndNums(List<BigDecimal> list,PxChannelPrice price){
if(list==null||list.isEmpty()){
Tuple2.of(BigDecimal.ZERO,0);
}
Collections.sort((List<BigDecimal>) list, new Comparator<BigDecimal>() {
@Override
public int compare(BigDecimal o1, BigDecimal o2) {
return o2.compareTo(o1);
}
});
BigDecimal taxSum = BigDecimal.ZERO;//税费
BigDecimal taxLmt = new BigDecimal(50);//税费限制
int bagCnt = 0;//分包数量
for (int i = 0;i<list.size();i++){
BigDecimal decimal = list.get(i);

if(decimal.compareTo(taxLmt)>-1){
bagCnt++;
}else {
if(taxSum.add(decimal).compareTo(taxLmt)>-1){
bagCnt++;
taxSum = decimal;
}else{
taxSum = taxSum.add(decimal);

}
}
}
if(taxSum.compareTo(BigDecimal.ZERO)==1){
bagCnt++;
}
return Tuple2.of(new BigDecimal(bagCnt).multiply(price.getInitialWeightPrice()),bagCnt);
}


public class Tuple2<V1, V2> {

private final V1 v1;
private final V2 v2;

public Tuple2(V1 t1, V2 t2) {
this.v1 = t1;
this.v2 = t2;
}

public static <V1, V2> Tuple2<V1, V2> of(V1 v1, V2 v2) {
return new Tuple2<>(v1, v2);
}

public V1 _1() {
return v1;
}

public V2 _2() {
return v2;
}

@Override
public String toString() {
return "(" + v1 + "," + v2 + ')';
}

@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;

Tuple2<?, ?> tuple2 = (Tuple2<?, ?>) o;

if (!v1.equals(tuple2.v1))
return false;
return v2.equals(tuple2.v2);

}

@Override
public int hashCode() {
int result = v1.hashCode();
result = 31 * result + v2.hashCode();
return result;
}
}
<think>嗯,用户想用Weka对数据集里的某个关键属性做离散化处理,然后对比前后的图形变化。首先我得确认自己是否清楚整个流程,可能需要分步骤来解答。 首先,用户需要知道如何在Weka里加载数据。可能得提醒他们支持的文件格式,比如ARFF或者CSV。然后,预处理阶段选择离散化过滤器,这一步要注意参数设置,比如分箱的数量和离散化方法。 接下来是处理后的步骤,用户可能需要保存处理后的数据集,方便后续分析。然后,对比图形变化的话,可能需要用Weka的可视化工具,比如用直方图或者散点图来展示离散化前后的分布差异。 需要提醒用户注意选择合适的离散化方法,比如等宽或等频,不同的方法结果可能不同。另外,离散化可能会影响模型性能,比如分类或回归任务,这也是需要说明的地方。 用户可能的疑问点包括:如何选择分箱数目?离散化后数据的信息损失如何?图形变化应该关注哪些方面?可能需要建议他们从数据分布和后续任务效果两方面评估。 还要确保回答结构清晰,逐步引导用户操作,同时解释每个步骤的意义。可能还需要举例说明,比如用年龄属性分箱成青年、中年、老年,然后对比直方图的变化,强调离散化如何简化数据分布,减少噪声。 另外,注意使用中文,避免使用Markdown格式,保持口语化,但又要准确。需要检查是否所有数学表达式都正确用$符号包裹,独立公式用$$,虽然在这个问题中可能涉及数学较少,但如果有的话要正确应用。 总结下来,回答应该分步骤,先操作流程,再图形对比,最后说明意义和注意事项,确保用户能够按步骤实施并理解结果。</think>好的,我将分步骤为您解释在Weka中实现属性离散化及对比分析的完整流程: 一、数据准备阶段 1. 数据格式要求 - 支持ARFF(推荐)/CSV格式 - 需确保目标属性为数值型(离散化仅作用于数值属性) 二、离散化操作流程 1. 加载数据 - 进入Preprocess标签页 - 点击"Open File"导入数据集 2. 应用离散化过滤器 ```操作路径 Choose -> filters -> unsupervised -> attribute -> Discretize ``` - 参数设置建议: - `bins`:默认10段,需根据数据分布调整 - `useEqualFrequency`:True时为等频分箱,False为等宽分箱 - `attributeIndices`:指定目标属性位置(如"first"或"last") 3. 执行处理 - 点击"Apply"完成离散化 - 建议保存处理后数据集(File -> Save) 三、可视化对比方法 1. 离散化前可视化 - 选择目标属性直方图 - 观察原始数值分布特征: $$ \text{分布形态} = \frac{1}{n}\sum_{i=1}^{n}(x_i - \mu)^2 $$ ![示例对比图](https://i.imgur.com/ZlHqN7L.png) (注:此处应为实际生成的对比图示意) 2. 离散化后分析 - 查看新生成的标称属性分布 - 关注分箱后的类别均衡性 - 典型变化特征: - 连续曲线→阶梯状分布 - 异常值被归入边界区间 - 数据稀疏区域合并 四、实例说明(以年龄属性为例) 1. 原始分布特征 - 连续值范围18-85岁 - 右偏分布(中青年居多) 2. 离散化后(分为3段) - [18,30): 青年 - [30,50): 中年 - [50,85]: 老年 - 分布呈现明显的区间聚集特征 五、核心影响分析 1. 信息变化 - 优势:降低噪声敏感性 - 代价:损失数值精度 - 信息熵变化公式: $$ H(X) = -\sum_{i=1}^{n}P(x_i)\log_2 P(x_i) $$ 2. 对模型的影响 - 提升决策树等算法的效率 - 可能弱化回归模型的精度 - 增强规则的可解释性 六、注意事项 1. 分箱策略选择 - 等宽分箱:适用于均匀分布 - 等频分箱:应对长尾分布 - 自定义分割点(需领域知识) 2. 验证方法 - 对比分类准确率变化 - 计算信息增益比: $$ \text{GainRatio} = \frac{H(C) - H(C|A)}{H(A)} $$ 建议先通过Explorer界面进行多次参数试验,再结合KnowledgeFlow进行批处理验证。离散化本质是数据约简过程,需根据后续任务需求平衡粒度粗细。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值