2009-08-04 24 views

Trả lời

11

Lặp lại mặc dù, tìm giá trị lớn nhất (gọi là MAXVAL), sau đó lặp lại một lần nữa và nhân mỗi giá trị trong danh sách theo (100/MAXVAL).

var ratio = 100.0/list.Max(); 
var normalizedList = list.Select(i => i * ratio).ToList(); 
+0

về số âm? – Kobi

+0

oh và giá trị tối đa có thể là 0, vì vậy bạn có 100/0. – Kobi

+1

Có, trường hợp ranh giới đó có lẽ nên được kiểm tra - mặc dù không có cách nào thực sự tốt để 'bình thường hóa' một danh sách tất cả đều bằng không. – Amber

8

Nếu bạn có danh sách các số dương hoàn toàn, thì câu trả lời của Dav sẽ phù hợp với bạn.

Nếu danh sách có thể là bất kỳ số nào, thì bạn cũng cần phải chuẩn hóa theo hướng xuống.

Giả sử một giới hạn trên 100 và dưới của 0, bạn sẽ muốn một cái gì đó như thế này ...

var max = list.Max(); 
var min = list.Min(); 
var range = (double)(max - min); 
var normalised 
    = list.Select(i => 100 * (i - min)/range) 
     .ToList(); 

Xử lý trường hợp min == max là trái như một bài tập cho người đọc ...

+0

Hm ... Điều đó sẽ cho bạn một danh sách các giá trị từ 0 đến 1 ... – Guffa

+0

Bạn nói đúng - tôi sẽ sửa chữa. – Bevan

6

để bình thường hóa một tập hợp các số có thể chứa các giá trị âm,
và để xác định phạm vi quy mô bình thường của:

List<int> list = new List<int>{-5,-4,-3,-2,-1,0,1,2,3,4,5}; 
double scaleMin = -1; //the normalized minimum desired 
double scaleMax = 1; //the normalized maximum desired 

double valueMax = list.Max(); 
double valueMin = list.Min(); 
double valueRange = valueMax - valueMin; 
double scaleRange = scaleMax - scaleMin; 

IEnumerable<double> normalized = 
    list.Select (i => 
     ((scaleRange * (i - valueMin)) 
      /valueRange) 
     + scaleMin); 
Các vấn đề liên quan