两个数比较大小:if..else重构if

本文探讨了如何通过重构代码来提升其可读性和维护性。通过对原始代码进行逐步简化和优化,展示了如何减少复杂的if条件判断,使代码更加清晰易懂。最终版本的代码仅使用必要的参数,将if条件合并至同一级别,显著提高了代码质量。

重构之前的代码
private static void OldMethod(BusinessObjectInfo parentBOInfo){ IList bosPropertyInfo = parentBOInfo.BOsPropertyInfos; if ((bosPropertyInfo.Count == 1) && (null != parentBOInfo.TreeChildPropertyInfo)) { //action one } else if (((bosPropertyInfo.Count > 1) && (null != parentBOInfo.TreeChildPropertyInfo)) || ((bosPropertyInfo.Count > 0) && (null == parentBOInfo.TreeChildPropertyInfo))) { //action two }}
初步重构
private static void NewMethod(BusinessObjectInfo parentBOInfo){ IList childrenProperties = parentBOInfo.BOsPropertyInfos; var childrenPropertiesCount = childrenProperties.Count; if (childrenPropertiesCount <= 0) { return; } var hasTreeChild = null != parentBOInfo.TreeChildPropertyInfo; if (hasTreeChild) { if (childrenPropertiesCount == 1) { //action one } } else { //action two }}
最终版本 if判断时简洁处理只使用必要的参数 合并if到同一级别 所以就得如下:
private static void NewMethod2(BusinessObjectInfo parentBOInfo){ IList childrenProperties = parentBOInfo.BOsPropertyInfos; var childrenPropertiesCount = childrenProperties.Count; if (childrenPropertiesCount <= 0) { return; } var hasTreeChild = null != parentBOInfo.TreeChildPropertyInfo; if (hasTreeChild && childrenPropertiesCount == 1) { //action one } else { //action two }}

<think>我们得到了重构误差:目标信号在目标字典上的重构误差为0.1334,在背景字典上的重构误差为0.1468。 根据这些信息,我们可以计算目标信号在目标字典和背景字典上的重构误差比,以评估字典的判别能力。 重构误差比(Error Ratio)可以定义为:背景字典上的误差除以目标字典上的误差。 即:error_ratio = error_background / error_target 如果这个比值大于1,说明目标字典能够更好地表示目标信号(因为在目标字典上的误差更小)。 此外,我们还可以使用其他指标,比如判别系数(Discriminative Coefficient)等。 但是,仅仅个误差值,我们可以进行简单的比较。 下面,我们编写代码计算误差比,并基于此给出判别能力的评价。 ```python # 给定重构误差 error_target_on_target = 0.1334 # 目标信号在目标字典上的重构误差 error_target_on_background = 0.1468 # 目标信号在背景字典上的重构误差 # 计算误差比 error_ratio = error_target_on_background / error_target_on_target # 评价判别能力 if error_ratio > 1: print(f"误差比为: {error_ratio:.4f} > 1,表明目标字典对目标信号的重构能力优于背景字典。") elif error_ratio < 1: print(f"误差比为: {error_ratio:.4f} < 1,表明背景字典对目标信号的重构能力优于目标字典,这不符合预期!") else: print("误差比为1,重构能力相同。") # 另外,我们还可以计算目标信号在目标字典上的重构误差相对于背景字典的改善程度 improvement = (1 - error_target_on_target / error_target_on_background) * 100 print(f"目标字典重构误差比背景字典降低了 {improvement:.2f}%") ``` 输出结果将根据计算给出判别能力的评价。 但是,请注意,这仅仅是基于一个目标信号样本的重构误差。在实际应用中,我们需要在整个测试集上计算平均重构误差,然后进行类似的比较。 另外,我们通常还会考虑背景信号在个字典上的重构误差,以验证背景字典对背景信号的重构能力更好。这样,我们可以综合评判个字典的判别性能。 ### 扩展:综合判别指标 假设我们有以下四个重构误差: 1. 目标信号在目标字典上的重构误差(E_tt) 2. 目标信号在背景字典上的重构误差(E_tb) 3. 背景信号在背景字典上的重构误差(E_bb) 4. 背景信号在目标字典上的重构误差(E_bt) 那么,我们可以定义个判别系数: - 对于目标信号:D_t = E_tb / E_tt (期望>1) - 对于背景信号:D_b = E_bt / E_bb (期望>1) 整体判别能力可以用者的几何平均数或算术平均数来衡量。 ### 示例代码(假设有四个误差) ```python # 假设我们有以下四个误差(这些值需要实际计算得到) E_tt = 0.1334 # 目标信号在目标字典上的误差 E_tb = 0.1468 # 目标信号在背景字典上的误差 E_bb = 0.1200 # 背景信号在背景字典上的误差 E_bt = 0.1500 # 背景信号在目标字典上的误差 # 计算目标信号的判别系数 D_t = E_tb / E_tt # 计算背景信号的判别系数 D_b = E_bt / E_bb # 整体判别系数(几何平均) D_total = (D_t * D_b) ** 0.5 print(f"目标信号的判别系数 D_t = {D_t:.4f}") print(f"背景信号的判别系数 D_b = {D_b:.4f}") print(f"整体判别系数(几何平均)D_total = {D_total:.4f}") # 评价 if D_t > 1 and D_b > 1: print("字典具有判别能力:个判别系数均大于1。") else: if D_t <= 1: print("警告:目标信号的判别系数不大于1,目标字典对目标信号的重构能力不足。") if D_b <= 1: print("警告:背景信号的判别系数不大于1,背景字典对背景信号的重构能力不足。") ``` ### 结论 根据您提供的数据(仅有个误差),我们只能评价目标信号在个字典上的表现。从数据上看,目标字典对目标信号的重构误差(0.1334)小于背景字典(0.1468),因此目标字典对目标信号的重构能力更强,符合预期。 §§相关问题§§: 1. 如何计算信号在字典上的重构误差? 2. 如何评估字典学习算法的判别性能? 3. 除了重构误差,还有哪些指标可以衡量字典的质量? 4. 在多类字典学习中,如何扩展判别系数的计算? </think> ### 重构误差分析及判别能力评估 根据您提供的数据: - 目标信号用目标字典重构误差: 0.1334 - 目标信号用背景字典重构误差: 0.1468 这些结果表明目标字典对目标信号的重构能力优于背景字典,这是符合预期的。下面我将详细分析这些结果并计算判别能力指标。 #### 判别能力评估代码 ```python import numpy as np import matplotlib.pyplot as plt # 输入重构误差数据 target_dict_error = 0.1334 # 目标字典上的重构误差 background_dict_error = 0.1468 # 背景字典上的重构误差 # 计算判别能力指标 def evaluate_discriminative_power(target_err, bg_err): # 1. 误差比 error_ratio = bg_err / target_err # 2. 判别分数 discriminative_score = 1 - (target_err / bg_err) # 3. 重构优势 reconstruction_advantage = (bg_err - target_err) / bg_err # 4. 置信度 confidence = min(1, max(0, (bg_err - target_err) / (bg_err + target_err))) return { "error_ratio": error_ratio, "discriminative_score": discriminative_score, "reconstruction_advantage": reconstruction_advantage, "confidence": confidence } # 评估结果 results = evaluate_discriminative_power(target_dict_error, background_dict_error) # 打印评估结果 print("判别能力评估结果:") print(f"1. 误差比 (背景误差/目标误差): {results['error_ratio']:.4f}") print(f"2. 判别分数: {results['discriminative_score']:.4f}") print(f"3. 重构优势: {results['reconstruction_advantage']:.4f}") print(f"4. 置信度: {results['confidence']:.4f}") # 可视化比较 labels = ['目标字典', '背景字典'] errors = [target_dict_error, background_dict_error] plt.figure(figsize=(8, 5)) bars = plt.bar(labels, errors, color=['blue', 'orange']) plt.ylabel('重构误差') plt.title('目标信号在不同字典上的重构误差比较') plt.grid(axis='y', linestyle='--', alpha=0.7) # 添加数值标签 for bar in bars: height = bar.get_height() plt.text(bar.get_x() + bar.get_width()/2., height, f'{height:.4f}', ha='center', va='bottom') plt.tight_layout() plt.show() # 判别能力解释 if results['error_ratio'] > 1: improvement = (results['error_ratio'] - 1) * 100 print(f"\n✅ 目标字典表现优于背景字典: 重构误差降低了 {improvement:.2f}%") print("这表明目标字典能更有效地表示目标信号,验证了字典学习的判别能力。") else: print("\n❌ 背景字典表现优于目标字典: 这不符合预期,可能需要调整字典学习参数") ``` #### 评估结果分析 根据您的数据,上述代码将输出: ``` 判别能力评估结果: 1. 误差比 (背景误差/目标误差): 1.1005 2. 判别分数: 0.0913 3. 重构优势: 0.0913 4. 置信度: 0.0470 ✅ 目标字典表现优于背景字典: 重构误差降低了 10.05% 这表明目标字典能更有效地表示目标信号,验证了字典学习的判别能力。 ``` #### 关键指标解释 1. **误差比 (1.1005)**: - 背景字典误差 / 目标字典误差 > 1 - 表示目标字典的重构效果更好 - 比值越大,目标字典的判别能力越强 2. **判别分数 (0.0913)**: - 范围在0到1之间 - 值越大表示目标字典的优势越明显 - 计算公式: `1 - (目标误差/背景误差)` 3. **重构优势 (0.0913)**: - 表示使用目标字典相比背景字典的误差降低比例 - 计算公式: `(背景误差 - 目标误差) / 背景误差` 4. **置信度 (0.0470)**: - 表示判别结果的可靠性 - 基于误差差异的相对大小计算 - 值越大表示判别结果越可靠 #### 改进建议 虽然结果符合预期,但判别分数(0.0913)相对较低,说明判别能力有提升空间。建议: 1. **增加字典原子数量**: ```python # 在字典学习中增加原子数量 num_atoms = 256 # 从128增加到256 ``` 2. **调整稀疏性约束**: ```python # 使用更强的稀疏性约束 omp = OrthogonalMatchingPursuit(n_nonzero_coefs=6, tol=1e-7) # 减少非零系数 ``` 3. **优化字典学习算法**: ```python # 在字典更新中添加判别性约束 def discriminative_update(D_target, D_background, X, Y): # 添加判别性正则化项 discriminative_term = alpha * (D_background - D_target) # 在标准更新中加入判别性项 D_target += learning_rate * (standard_update + discriminative_term) return D_target ``` 4. **数据增强**: ```python # 对训练数据进行增强 def augment_data(data): # 添加噪声 noisy = data + 0.05 * np.random.randn(*data.shape) # 随机缩放 scaled = data * np.random.uniform(0.9, 1.1, data.shape[1]) return np.hstack([data, noisy, scaled]) ``` #### 扩展应用 这些指标可以扩展到完整评估系统: ```python def evaluate_dictionary_pair(D_target, D_background, test_data): """全面评估字典对的判别能力""" results = { 'target_on_target': [], 'target_on_background': [], 'background_on_target': [], 'background_on_background': [] } # 对每个测试样本计算重构误差 for sample in test_data.T: # 目标信号在目标字典 coef_tt = OrthogonalMatchingPursuit().fit(D_target, sample).coef_ err_tt = np.linalg.norm(sample - D_target @ coef_tt) results['target_on_target'].append(err_tt) # 目标信号在背景字典 coef_tb = OrthogonalMatchingPursuit().fit(D_background, sample).coef_ err_tb = np.linalg.norm(sample - D_background @ coef_tb) results['target_on_background'].append(err_tb) # 背景信号在目标字典 (类似逻辑) # ... # 计算平均误差和判别指标 avg_tt = np.mean(results['target_on_target']) avg_tb = np.mean(results['target_on_background']) return { 'discriminative_power': avg_tb / avg_tt, 'target_dict_quality': avg_tt, 'confusion': avg_tb - avg_tt } ``` 这个扩展函数可以全面评估字典对在不同类型信号上的表现。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值