我有以下数字列表:
3.16,4.72,6.44,8.25,3.76,4.87,5.76,6.5,7.32
我必须在(0,1)之间重新调整数字,以便:
1)最小的数字得到一个最接近0但不是0的值。
2)最大数字的值最接近1而不是1。
在我的研究中,0表示完全合适,1表示完全不合适,这就是为什么我要将它们排除在最终结果之外。
非常感谢任何帮助。
答案 0 :(得分:2)
这种转变有帮助吗?
V' = 1/(1 + e^(-V)) -------- Logistic function
域名 - 实数,V
可以取任何实际值
Range - (0,1)
0<V'<1
,V'<>0
,V'<>1
和{{1}}
答案 1 :(得分:0)
您可能需要仿射映射(即y = mx + c
形式),例如:
not_quite_0 = m*min_val + c
not_quite_1 = m*max_val + c
解决这些方程,得到:
m = (not_quite_1 - not_quite_0) / (max_val - min_val)
c = (max_val*not_quite_0 - min_val*not_quite_1) / (max_val - min_val)
您可以定义not_quite_0 = 0 + eps
和not_quite_1 = 1 - eps
,其中eps
的值非常小。
答案 2 :(得分:0)
我不确定我理解你的问题,但是找到集合中的最大数字,并将集合中的每个数字除以该最大数字将为您提供合适的范围。
答案 3 :(得分:0)
使用仿射变换在Python中的一个简单示例:
list = [3.16, 4.72, 6.44, 8.25, 3.76, 4.87, 5.76, 6.5, 7.32]
# find the minimum value and range, and add 1% padding
range_value = max(list) - min(list)
range_value = range_value + range_value/50
min_value = min(list) - range_value/100
# subtract the minimum value and divide by the range
for index, item in enumerate(list):
list[index] = (item - min_value) / range_value
print list
给出结果:
[0.010000000000000026, 0.310473824107246, 0.64176547632805592, 0.99039215686274518, 0.1255668554258639, 0.33936553796371205, 0.51078970684541003, 0.65332216187064218, 0.81126353095265591]
当然,您可以将填充量更改为您想要的小 - 对于范围,您需要添加两倍的最小值,因为您需要添加填充到范围的每一端。