如何将任意数量的列表转换为0到1之间

时间:2010-06-17 10:18:57

标签: c#

例如:

我有如下列表的数量:{12,23,34,45,65}在0和1之间改变 {0,0.2,0.4,0.6,0.8}。有没有人知道某种算法?

6 个答案:

答案 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)

  1. 查找序列中的最大数量。
  2. 将所有数字除以最大值 编号

答案 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);
}