Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import scipy.stats as stats
- from scipy.optimize import fsolve
- # 全局变量定义
- MALODY_RULES = {
- 'A': {'BEST': 52, 'COOL': 92, 'GOOD': 126, 'MISS': 150},
- 'B': {'BEST': 44, 'COOL': 84, 'GOOD': 118, 'MISS': 150},
- 'C': {'BEST': 36, 'COOL': 76, 'GOOD': 110, 'MISS': 150},
- 'D': {'BEST': 28, 'COOL': 68, 'GOOD': 102, 'MISS': 150},
- 'E': {'BEST': 20, 'COOL': 60, 'GOOD': 94, 'MISS': 150},
- }
- OM_THRESHOLDS_TEMPLATE = {
- '300': lambda OD: 64 - 3 * OD,
- '200': lambda OD: 97 - 3 * OD,
- '100': lambda OD: 127 - 3 * OD,
- '50': lambda OD: 151 - 3 * OD,
- }
- OM_ACC_VALUES = {
- '300': 1.00,
- '200': 2 / 3,
- '100': 1 / 3,
- '50': 1 / 6,
- }
- def calculate_malody_stddev(acc, rule):
- def calculate_accuracy(stddev):
- p_best = stats.norm.cdf(rule['BEST'], 0, stddev) - stats.norm.cdf(-rule['BEST'], 0, stddev)
- p_cool = stats.norm.cdf(rule['COOL'], 0, stddev) - stats.norm.cdf(-rule['COOL'], 0, stddev) - p_best
- p_good = stats.norm.cdf(rule['GOOD'], 0, stddev) - stats.norm.cdf(-rule['GOOD'], 0, stddev) - p_cool - p_best
- total_accuracy = (p_best * 1.00 +
- p_cool * 0.75 +
- p_good * 0.40)
- return total_accuracy
- stddev = fsolve(lambda x: calculate_accuracy(x) - acc, 20 , xtol=1e-6)[0]
- return stddev
- def calculate_om_stddev(acc, OD):
- thresholds = {key: func(OD) for key, func in OM_THRESHOLDS_TEMPLATE.items()}
- def calculate_accuracy(stddev):
- p_300 = stats.norm.cdf(thresholds['300'], 0, stddev) - stats.norm.cdf(-thresholds['300'], 0, stddev)
- p_200 = stats.norm.cdf(thresholds['200'], 0, stddev) - stats.norm.cdf(-thresholds['200'], 0, stddev) - p_300
- p_100 = stats.norm.cdf(thresholds['100'], 0, stddev) - stats.norm.cdf(-thresholds['100'], 0, stddev) - p_200 - p_300
- p_50 = stats.norm.cdf(thresholds['50'], 0, stddev) - stats.norm.cdf(-thresholds['50'], 0, stddev) - p_100 - p_200 - p_300
- total_accuracy = (p_300 * OM_ACC_VALUES['300'] +
- p_200 * OM_ACC_VALUES['200'] +
- p_100 * OM_ACC_VALUES['100'] +
- p_50 * OM_ACC_VALUES['50'])
- return total_accuracy
- stddev = fsolve(lambda x: calculate_accuracy(x) - acc, 20, xtol=1e-6)[0]
- return stddev
- def calculate_malody_acc(stddev, rule):
- p_best = stats.norm.cdf(rule['BEST'], 0, stddev) - stats.norm.cdf(-rule['BEST'], 0, stddev)
- p_cool = stats.norm.cdf(rule['COOL'], 0, stddev) - stats.norm.cdf(-rule['COOL'], 0, stddev) - p_best
- p_good = stats.norm.cdf(rule['GOOD'], 0, stddev) - stats.norm.cdf(-rule['GOOD'], 0, stddev) - p_cool - p_best
- total_accuracy = (p_best * 1.00 +
- p_cool * 0.75 +
- p_good * 0.40)
- return total_accuracy
- def calculate_om_acc(stddev, OD):
- thresholds = {key: func(OD) for key, func in OM_THRESHOLDS_TEMPLATE.items()}
- p_300 = stats.norm.cdf(thresholds['300'], 0, stddev) - stats.norm.cdf(-thresholds['300'], 0, stddev)
- p_200 = stats.norm.cdf(thresholds['200'], 0, stddev) - stats.norm.cdf(-thresholds['200'], 0, stddev) - p_300
- p_100 = stats.norm.cdf(thresholds['100'], 0, stddev) - stats.norm.cdf(-thresholds['100'], 0, stddev) - p_200 - p_300
- p_50 = stats.norm.cdf(thresholds['50'], 0, stddev) - stats.norm.cdf(-thresholds['50'], 0, stddev) - p_100 - p_200 - p_300
- total_accuracy = (p_300 * OM_ACC_VALUES['300'] +
- p_200 * OM_ACC_VALUES['200'] +
- p_100 * OM_ACC_VALUES['100'] +
- p_50 * OM_ACC_VALUES['50'])
- return total_accuracy
- # 主程序入口
- def main():
- print("请选择功能:")
- print("1: M2O:输入 Malody 判定、Malody ACC 和 OD,计算 O!M 的 ACC")
- print("2: O2M:输入 OD 和 O!M 的 ACC,计算 Malody 的 ACC")
- print("3: M2M:在不同 Malody 判定之间转换 ACC")
- print("4: O2O:在不同 O!M 判定之间转换 ACC")
- choice = int(input("请输入选择 (1/2/3/4): "))
- if choice == 1:
- print("可用的 Malody 判定规则:A, B, C, D, E")
- rule_choice = input("请选择 Malody 判定规则(A/B/C/D/E):").strip().upper()
- if rule_choice not in MALODY_RULES:
- print("无效的规则选择,请选择 A, B, C, D, 或 E。")
- return
- malody_acc = float(input("请输入 Malody 的准确率 (例如 0.95):"))
- OD = float(input("请输入 OD 值(例如 9.2):"))
- rule = MALODY_RULES[rule_choice]
- stddev = calculate_malody_stddev(malody_acc, rule)
- om_acc = calculate_om_acc(stddev, OD)
- print(f"标准差为: {stddev:.2f} ms")
- print(f"O!M 准确率为: {om_acc:.4f}")
- elif choice == 2:
- OD = float(input("请输入 OD 值(例如 9.2):"))
- om_acc = float(input("请输入 O!M 的准确率 (例如 0.96):"))
- stddev = calculate_om_stddev(om_acc, OD)
- print("可用的 Malody 判定规则:A, B, C, D, E")
- rule_choice = input("请选择 Malody 判定规则(A/B/C/D/E):").strip().upper()
- if rule_choice not in MALODY_RULES:
- print("无效的规则选择,请选择 A, B, C, D, 或 E。")
- return
- rule = MALODY_RULES[rule_choice]
- malody_acc = calculate_malody_acc(stddev, rule)
- print(f"标准差为: {stddev:.2f} ms")
- print(f"Malody 准确率为: {malody_acc:.4f}")
- elif choice == 3:
- print("可用的 Malody 判定规则:A, B, C, D, E")
- from_rule = input("请选择源 Malody 判定规则(A/B/C/D/E):").strip().upper()
- to_rule = input("请选择目标 Malody 判定规则(A/B/C/D/E):").strip().upper()
- if from_rule not in MALODY_RULES or to_rule not in MALODY_RULES:
- print("无效的规则选择,请选择 A, B, C, D, 或 E。")
- return
- malody_acc = float(input("请输入源 Malody 的准确率 (例如 0.95):"))
- stddev = calculate_malody_stddev(malody_acc, MALODY_RULES[from_rule])
- target_acc = calculate_malody_acc(stddev, MALODY_RULES[to_rule])
- print(f"目标规则 {to_rule} 下的准确率为: {target_acc:.4f}")
- elif choice == 4:
- from_acc = float(input("请输入源 O!M 的准确率 (例如 0.96):"))
- OD = float(input("请输入源OD 值(例如 9.2):"))
- stddev = calculate_om_stddev(from_acc, OD)
- to_OD = float(input("请输入目标OD 值(例如 9.2):"))
- to_acc = calculate_om_acc(stddev, to_OD)
- print(f"目标 O!M 的准确率为: {to_acc:.4f}")
- # 运行主程序
- if __name__ == "__main__":
- main()
- input("程序执行完毕,按任意键退出...")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement