例如:
我有如下列表的数量:{12,23,34,45,65}在0和1之间改变 {0,0.2,0.4,0.6,0.8}。有没有人知道某种算法?
答案 0 :(得分:6)
double max = 1.0 * oldList.Max();
var newList = oldList.Select(x => x / max);
如果您希望将最小数字映射到0,那么您需要这样的内容:
double min = 1.0 * oldList.Min();
double max = 1.0 * oldList.Max();
var newList = oldList.Select(x => (x - min) / (max - min));
答案 1 :(得分:1)
算法:
注意:这会将最大值映射到1.0 ...但是在您的示例中并非如此。
编辑:
var min = list.First(); // assumes a sorted list, else use Min()
var max = list.Last(); // assumes a sorted list, else use Max()
double difference = max - min;
var newList = list.Select( i => Math.Round( (i - min ) / difference, 1 ) );
答案 2 :(得分:1)
一种非常简单有效的方法是进行logit转换。 Logit公式为:
y = ln (x / (1 - x))
其中y
是一个介于0和1之间的数字,遵循二进制分布。此外,它很棒,因为y
可以是零或负面。
让我们绕过它,所以我们可以将我们的数据(y
)转换为二项分布(无限数字在0和1之间收缩)。
y = ln (x / (1 - x))
exp(y) = exp (ln(x / (1 - x)) # to get rid of ln() we can make the exp() on both sides
exp(y) = x / (1 - x) # exponential rule: exp(ln(z)) = z
x = exp(y) * (1 - x)
x = exp(y) - x * exp(y)
x + x * exp(y) = exp(y)
x (1 + exp(y) = exp(y)
x = exp(y)/(1 + exp(y))
这比其他建议更简单,更简单! 我希望有所帮助!
答案 3 :(得分:0)
期望您希望最高值为1.0,最低值为0.0,并且您的数组按从低到高的顺序排列:
int lowest = myArray[0];
int highest = myArray[myArray.Length-1];
int diff = highest - lowest;
foreach (int item in myArray)
Console.WriteLine = (float)(item - lowest) / diff;
答案 4 :(得分:0)
答案 5 :(得分:0)
如果您希望最低映射为0,并将最高映射为1,则以下内容将实现此目的:
var input = new double[] { 12, 23, 34, 45, 65 };
var outputList = input.ToList().Select(i => (i - input.Min()) / (input.Max() - input.Min()));
foreach (var i in outputList)
{
Console.WriteLine(i);
}