Advertisement
Guest User

accuracy converter

a guest
Dec 23rd, 2024
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.73 KB | Source Code | 0 0
  1. import scipy.stats as stats
  2. from scipy.optimize import fsolve
  3.  
  4. # 全局变量定义
  5. MALODY_RULES = {
  6.     'A': {'BEST': 52, 'COOL': 92, 'GOOD': 126, 'MISS': 150},
  7.     'B': {'BEST': 44, 'COOL': 84, 'GOOD': 118, 'MISS': 150},
  8.     'C': {'BEST': 36, 'COOL': 76, 'GOOD': 110, 'MISS': 150},
  9.     'D': {'BEST': 28, 'COOL': 68, 'GOOD': 102, 'MISS': 150},
  10.     'E': {'BEST': 20, 'COOL': 60, 'GOOD': 94, 'MISS': 150},
  11. }
  12.  
  13. OM_THRESHOLDS_TEMPLATE = {
  14.     '300': lambda OD: 64 - 3 * OD,
  15.     '200': lambda OD: 97 - 3 * OD,
  16.     '100': lambda OD: 127 - 3 * OD,
  17.     '50': lambda OD: 151 - 3 * OD,
  18. }
  19.  
  20. OM_ACC_VALUES = {
  21.     '300': 1.00,
  22.     '200': 2 / 3,
  23.     '100': 1 / 3,
  24.     '50': 1 / 6,
  25. }
  26.  
  27. def calculate_malody_stddev(acc, rule):
  28.     def calculate_accuracy(stddev):
  29.         p_best = stats.norm.cdf(rule['BEST'], 0, stddev) - stats.norm.cdf(-rule['BEST'], 0, stddev)
  30.         p_cool = stats.norm.cdf(rule['COOL'], 0, stddev) - stats.norm.cdf(-rule['COOL'], 0, stddev) - p_best
  31.         p_good = stats.norm.cdf(rule['GOOD'], 0, stddev) - stats.norm.cdf(-rule['GOOD'], 0, stddev) - p_cool - p_best
  32.  
  33.         total_accuracy = (p_best * 1.00 +
  34.                           p_cool * 0.75 +
  35.                           p_good * 0.40)
  36.         return total_accuracy
  37.  
  38.     stddev = fsolve(lambda x: calculate_accuracy(x) - acc, 20 , xtol=1e-6)[0]
  39.  
  40.     return stddev
  41.  
  42. def calculate_om_stddev(acc, OD):
  43.     thresholds = {key: func(OD) for key, func in OM_THRESHOLDS_TEMPLATE.items()}
  44.  
  45.     def calculate_accuracy(stddev):
  46.         p_300 = stats.norm.cdf(thresholds['300'], 0, stddev) - stats.norm.cdf(-thresholds['300'], 0, stddev)
  47.         p_200 = stats.norm.cdf(thresholds['200'], 0, stddev) - stats.norm.cdf(-thresholds['200'], 0, stddev) - p_300
  48.         p_100 = stats.norm.cdf(thresholds['100'], 0, stddev) - stats.norm.cdf(-thresholds['100'], 0, stddev) - p_200 - p_300
  49.         p_50 = stats.norm.cdf(thresholds['50'], 0, stddev) - stats.norm.cdf(-thresholds['50'], 0, stddev) - p_100 - p_200 - p_300
  50.  
  51.         total_accuracy = (p_300 * OM_ACC_VALUES['300'] +
  52.                           p_200 * OM_ACC_VALUES['200'] +
  53.                           p_100 * OM_ACC_VALUES['100'] +
  54.                           p_50 * OM_ACC_VALUES['50'])
  55.         return total_accuracy
  56.  
  57.     stddev = fsolve(lambda x: calculate_accuracy(x) - acc, 20, xtol=1e-6)[0]
  58.  
  59.     return stddev
  60.  
  61. def calculate_malody_acc(stddev, rule):
  62.     p_best = stats.norm.cdf(rule['BEST'], 0, stddev) - stats.norm.cdf(-rule['BEST'], 0, stddev)
  63.     p_cool = stats.norm.cdf(rule['COOL'], 0, stddev) - stats.norm.cdf(-rule['COOL'], 0, stddev) - p_best
  64.     p_good = stats.norm.cdf(rule['GOOD'], 0, stddev) - stats.norm.cdf(-rule['GOOD'], 0, stddev) - p_cool - p_best
  65.  
  66.     total_accuracy = (p_best * 1.00 +
  67.                       p_cool * 0.75 +
  68.                       p_good * 0.40)
  69.     return total_accuracy
  70.  
  71. def calculate_om_acc(stddev, OD):
  72.     thresholds = {key: func(OD) for key, func in OM_THRESHOLDS_TEMPLATE.items()}
  73.  
  74.     p_300 = stats.norm.cdf(thresholds['300'], 0, stddev) - stats.norm.cdf(-thresholds['300'], 0, stddev)
  75.     p_200 = stats.norm.cdf(thresholds['200'], 0, stddev) - stats.norm.cdf(-thresholds['200'], 0, stddev) - p_300
  76.     p_100 = stats.norm.cdf(thresholds['100'], 0, stddev) - stats.norm.cdf(-thresholds['100'], 0, stddev) - p_200 - p_300
  77.     p_50 = stats.norm.cdf(thresholds['50'], 0, stddev) - stats.norm.cdf(-thresholds['50'], 0, stddev) - p_100 - p_200 - p_300
  78.  
  79.     total_accuracy = (p_300 * OM_ACC_VALUES['300'] +
  80.                       p_200 * OM_ACC_VALUES['200'] +
  81.                       p_100 * OM_ACC_VALUES['100'] +
  82.                       p_50 * OM_ACC_VALUES['50'])
  83.     return total_accuracy
  84.  
  85. # 主程序入口
  86. def main():
  87.     print("请选择功能:")
  88.     print("1: M2O:输入 Malody 判定、Malody ACC 和 OD,计算 O!M 的 ACC")
  89.     print("2: O2M:输入 OD 和 O!M 的 ACC,计算 Malody 的 ACC")
  90.     print("3: M2M:在不同 Malody 判定之间转换 ACC")
  91.     print("4: O2O:在不同 O!M 判定之间转换 ACC")
  92.     choice = int(input("请输入选择 (1/2/3/4): "))
  93.  
  94.     if choice == 1:
  95.         print("可用的 Malody 判定规则:A, B, C, D, E")
  96.         rule_choice = input("请选择 Malody 判定规则(A/B/C/D/E):").strip().upper()
  97.         if rule_choice not in MALODY_RULES:
  98.             print("无效的规则选择,请选择 A, B, C, D, 或 E。")
  99.             return
  100.  
  101.         malody_acc = float(input("请输入 Malody 的准确率 (例如 0.95):"))
  102.         OD = float(input("请输入 OD 值(例如 9.2):"))
  103.  
  104.         rule = MALODY_RULES[rule_choice]
  105.         stddev = calculate_malody_stddev(malody_acc, rule)
  106.         om_acc = calculate_om_acc(stddev, OD)
  107.  
  108.         print(f"标准差为: {stddev:.2f} ms")
  109.         print(f"O!M 准确率为: {om_acc:.4f}")
  110.  
  111.     elif choice == 2:
  112.         OD = float(input("请输入 OD 值(例如 9.2):"))
  113.         om_acc = float(input("请输入 O!M 的准确率 (例如 0.96):"))
  114.  
  115.         stddev = calculate_om_stddev(om_acc, OD)
  116.  
  117.         print("可用的 Malody 判定规则:A, B, C, D, E")
  118.         rule_choice = input("请选择 Malody 判定规则(A/B/C/D/E):").strip().upper()
  119.         if rule_choice not in MALODY_RULES:
  120.             print("无效的规则选择,请选择 A, B, C, D, 或 E。")
  121.             return
  122.  
  123.         rule = MALODY_RULES[rule_choice]
  124.         malody_acc = calculate_malody_acc(stddev, rule)
  125.  
  126.         print(f"标准差为: {stddev:.2f} ms")
  127.         print(f"Malody 准确率为: {malody_acc:.4f}")
  128.  
  129.     elif choice == 3:
  130.         print("可用的 Malody 判定规则:A, B, C, D, E")
  131.         from_rule = input("请选择源 Malody 判定规则(A/B/C/D/E):").strip().upper()
  132.         to_rule = input("请选择目标 Malody 判定规则(A/B/C/D/E):").strip().upper()
  133.         if from_rule not in MALODY_RULES or to_rule not in MALODY_RULES:
  134.             print("无效的规则选择,请选择 A, B, C, D, 或 E。")
  135.             return
  136.  
  137.         malody_acc = float(input("请输入源 Malody 的准确率 (例如 0.95):"))
  138.         stddev = calculate_malody_stddev(malody_acc, MALODY_RULES[from_rule])
  139.         target_acc = calculate_malody_acc(stddev, MALODY_RULES[to_rule])
  140.  
  141.         print(f"目标规则 {to_rule} 下的准确率为: {target_acc:.4f}")
  142.  
  143.     elif choice == 4:  
  144.         from_acc = float(input("请输入源 O!M 的准确率 (例如 0.96):"))
  145.         OD = float(input("请输入源OD 值(例如 9.2):"))
  146.         stddev = calculate_om_stddev(from_acc, OD)
  147.         to_OD = float(input("请输入目标OD 值(例如 9.2):"))
  148.         to_acc = calculate_om_acc(stddev, to_OD)
  149.         print(f"目标 O!M 的准确率为: {to_acc:.4f}")
  150.  
  151. # 运行主程序
  152. if __name__ == "__main__":
  153.     main()
  154.     input("程序执行完毕,按任意键退出...")
  155.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement