問題
必要に応じて、ある間隔を別の間隔にマップする必要があります。0-1が10-32にマッピングされている場合、アルゴリズムはどのように設計する必要がありますか?
シーン1
たとえば、大学の教師は、学校が指定した科目を一時停止する可能性のある最終試験を実施しますが、すべての学生が試験に合格しない場合は、適切なフォームに従って学生の成績を調整する必要があります。
たとえば、学生の成績は一般的に貧弱で、20から65ポイントに分布しています。合格率を上げるには、55から100にマッピングする必要があります。
シーン2
ある国の交換留学生ですが、国の得点は5〜18点ですが、国の得点は0〜100点で、外国受験の点数を国内筆記に反映させる必要があります。それはまたしている5-18
にマップされ0-100
、う[5-18] -5 = [0, 13]
、それはボブの実績があると想定される12
ので、国内の成果はある12*(100/13)
原則があります、先归零,然后再同比例缩放
。
原理
スケーリングされるデータがXであり、マップされる範囲が[a、b]であるとすると、次の式を使用できます。
コード
def map_rate(X:list, to_min:float, to_max:float)->list:
"""区间映射
Attribute:
- X: 需要映射的列表
- to_min: 要映射到的最小值
- to_max: 要映射到的最大值
"""
x_min=min(X)
x_max=max(X)
return list([round(to_min+((to_max - to_min) / (x_max - x_min)) * i - x_min,1) for i in X])
このコードは比較的単純であり、パラメーターは上記の3つのパラメーターです:マップされるリスト、マップされる開始と終了、および最終結果のラウンド(x、2)ビット、小数点第1位を保持、それ以外の場合、得られる結果正確すぎる。
実験
たとえば、ランダムに生成された生徒の結果=を特定の範囲にマッピングします。
X=[67, 45, 81, 95, 23, 77, 65, 32, 55, 22]
map_rate(X, 60, 100)
結果は
[74.7, 62.7, 82.4, 90.1, 50.6, 80.2, 73.6, 55.5, 68.1, 50.1]
流通問題
これが分布に影響するかどうかは少し気になりますが、同じスケールなので影響はないでしょう。したがって、ポルトガルの中学生の学校の成績のデータセットを使用しました。URLは次のとおりです。https://www.mldata.io/dataset-details/school_grades/#customize_download
上記の方法を使用して、数学結果の分布が検証されました。
data1=pd.read_csv("./学生成绩.csv",encoding='utf8')
with open("./result.csv",'w',encoding='utf8') as f:
result_list="\n".join([str(i) for i in map_rate(list(data1['G3']),60,100)])
f.writelines(result_list)
結果を図に示します。
基本的に変更がないことがわかりますが、分布の異なるビニングによって引き起こされるいくつかの変更があります。