Làm thế nào để bình thường hóa dữ liệu đến phạm vi 0-1?


265

Tôi bị mất trong việc bình thường hóa, bất cứ ai có thể hướng dẫn tôi.

Tôi có các giá trị tối thiểu và tối đa, tương ứng -23,89 và 7,54990767.

Nếu tôi nhận được giá trị 5.6878, làm thế nào tôi có thể chia tỷ lệ giá trị này theo thang điểm từ 0 đến 1.


8
đây có phải là cách = (value-min) / (max-min)
Angelo

3
Nó có thể giúp bạn đọc chủ đề này: how-to-verify-a-phân phối-được chuẩn hóa . Nếu câu trả lời cho câu hỏi của bạn, bạn có thể xóa Q này; nếu không, hãy chỉnh sửa Q của bạn để chỉ định những gì bạn vẫn không hiểu.
gung

1
Giải thích về bảo vệ: Câu hỏi này đang thu hút các câu trả lời bổ sung chỉ chứa các giải pháp mã. Mặc dù những điều này có thể thú vị hoặc hữu ích với một số độc giả, nhưng đó không phải là mục đích của CV để cung cấp kho lưu trữ các giải pháp mã.
Nick Cox

1
các giải pháp được cung cấp xem xét một giá trị tương phản tuyến tính - bạn có muốn một chuẩn hóa khác, ví dụ như một giải pháp đạt được xác suất thống nhất cho đầu ra không?
meduz

Câu trả lời:


299

Nếu bạn muốn bình thường hóa dữ liệu của mình, bạn có thể làm như bạn đề xuất và chỉ cần tính toán như sau:

zi=ximin(x)max(x)min(x)

trong đó và hiện là dữ liệu chuẩn hóa . Như một bằng chứng về khái niệm (mặc dù bạn không yêu cầu) đây là một số mã và biểu đồ kèm theo để minh họa điểm này:x=(x1,...,xn)ziithR

nhập mô tả hình ảnh ở đây

# Example Data
x = sample(-100:100, 50)

#Normalized Data
normalized = (x-min(x))/(max(x)-min(x))

# Histogram of example data and normalized data
par(mfrow=c(1,2))
hist(x,          breaks=10, xlab="Data",            col="lightblue", main="")
hist(normalized, breaks=10, xlab="Normalized Data", col="lightblue", main="")

11
Tôi chỉ tự hỏi làm thế nào hai biểu đồ trông khá khác nhau làm illustrate the pointcâu trả lời (đúng) của bạn?
ttnphns

12
@ttnphns Chúng trông chỉ khác nhau do sự đóng gói của biểu đồ. Tuy nhiên, quan điểm của tôi là chỉ ra rằng các giá trị ban đầu nằm trong khoảng từ 100 đến 100 và bây giờ sau khi bình thường hóa chúng nằm trong khoảng từ 0 đến 1. Tôi có thể đã sử dụng một biểu đồ khác để hiển thị điều này tôi cho rằng hoặc chỉ là thống kê tóm tắt.

20
Ảnh khỏa thân nhẹ nhàng của @ttnphns có nghĩa là khuyến khích bạn không chỉ sử dụng một phương tiện ít phức tạp hơn để minh họa một ý tưởng (đơn giản), mà còn (tôi nghi ngờ) như một gợi ý rằng một minh họa có liên quan trực tiếp hơn có thể có ích ở đây. Bạn có thể thực hiện cả hai bằng cách tìm một cách đơn giản hơn để vẽ biểu đồ chuyển đổi khi nó được áp dụng cho min và max thực sự được cung cấp bởi OP
whuber

1
Có cách nào để "bình thường hóa" thành phạm vi tùy chỉnh thay vì 0-1 không?
John Demetriou

1
@JohnDemetriou Có thể không phải là giải pháp sạch nhất, nhưng bạn có thể chia tỷ lệ các giá trị chuẩn hóa để làm điều đó. Nếu bạn muốn phạm vi ví dụ là 0-100, bạn chỉ cần nhân mỗi số với 100. Nếu bạn muốn phạm vi không bắt đầu bằng 0, như 10-100, bạn sẽ thực hiện bằng cách chia tỷ lệ theo MAX-MIN và sau đó đến các giá trị bạn nhận được từ đó chỉ cần thêm MIN. Vì vậy, tỷ lệ 90, sau đó thêm 10. Điều đó là đủ cho hầu hết các phạm vi tùy chỉnh bạn có thể muốn.
Alexander Rossa

47

Công thức một dòng chung để định tuyến lại các giá trị dữ liệu đã quan sát tối thiểutối đa thành một phạm vi tùy ý mới min ' to max'

  newvalue= (max'-min')/(max-min)*(value-max)+max'
  or
  newvalue= (max'-min')/(max-min)*(value-min)+min'.

9
Điều này là chính xác, nhưng không hiệu quả. Nó là một phép biến đổi tuyến tính, vì vậy bạn sẽ tính toán trước abhằng số, và sau đó chỉ cần áp dụng newvalue = a * value + b. a = (max'-min')/(max-min)b = max - a * max
Mark Lakata

1
Bạn có biết làm thế nào để trích dẫn này? Ý tôi là, có một tài liệu tham khảo "gốc" ở đâu đó không?
Trefex

3
@MarkLakata Chỉnh sửa nhẹ (lỗi đánh máy?): b = max' - a * maxHoặcb = min' - (a * min)
Nick

@Nick - vâng. Tôi đang thiếu một '
Mark Lakata

Bạn có thể vui lòng so sánh bình thường hóa của bạn ở đây se.mathworks.com/matlabcentral/answers/ Khăn tức là phương trình u = -1 + 2.*(u - min(u))./(max(u) - min(u));.
Léo Léopold Hertz 준영

13

Đây là cách triển khai PHP của tôi để chuẩn hóa:

function normalize($value, $min, $max) {
	$normalized = ($value - $min) / ($max - $min);
	return $normalized;
}

Nhưng trong khi tôi đang xây dựng các mạng thần kinh nhân tạo của riêng mình, tôi cần phải chuyển đổi đầu ra được chuẩn hóa trở lại dữ liệu gốc để có được đầu ra tốt cho biểu đồ.

function denormalize($normalized, $min, $max) {
	$denormalized = ($normalized * ($max - $min) + $min);
	return $denormalized;
}

$int = 12;
$max = 20;
$min = 10;

$normalized = normalize($int, $min, $max); // 0.2
$denormalized = denormalize($normalized, $min, $max); //12

Không chuẩn hóa sử dụng công thức sau:

x(maxmin)+min


2
Có một sự khác biệt quan trọng giữa câu trả lời này và câu trả lời đã được chấp nhận. Điều đó giải thích ý tưởng chính rõ ràng và trực tiếp và sau đó chỉ ra cách thực hiện nó trong một chương trình thường được sử dụng. Ngược lại, bạn chỉ đăng ở đây mã. Mặc dù tôi rất vui khi tin rằng đây là mã tốt (tôi không viết PHP) trên diễn đàn này, chúng tôi thường không có một bó câu trả lời cho mọi câu hỏi giải thích cách thực hiện bằng mọi ngôn ngữ có thể hiểu được. Nếu không, chúng tôi sẽ có câu trả lời ở đây trong SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java. Python, v.v.
Nick Cox

2
Tôi không nghĩ rằng đây là điểm khác biệt duy nhất. Trong mã của tôi, tôi cũng chỉ ra, làm thế nào để trả về giá trị chuẩn hóa cho giá trị trước khi chuẩn hóa. Tôi nghĩ rằng, điều đó làm cho nó xứng đáng với câu trả lời này.
jankal

1
Vẫn đúng là bạn chỉ đăng mã: Tôi nghĩ bạn cần nhấn mạnh bất kỳ đức tính được cho là đặc biệt nào của mã trong bình luận, vì nếu không thì độc giả phải đọc mã để xem chúng là gì. Có lẽ đảo ngược tỷ lệ chỉ được sử dụng khi (a) các giá trị ban đầu đã bị ghi đè nhưng (b) người dùng đã ghi nhớ cẩn thận để tiết kiệm tối thiểu và tối đa. Điểm rộng hơn của tôi, như đã nhận xét ở trên, là CV không nhằm mục đích trở thành một kho lưu trữ các ví dụ mã.
Nick Cox

Có một số vấn đề, ví dụ bạn cần khôi phục giá trị: Ví dụ về Mạng lưới ... Nhưng bạn nói đúng, theo cách phân tích dữ liệu, câu trả lời này rất tệ.
jankal

3
@NickCox Tôi thấy câu trả lời của anh ấy thỏa đáng hơn câu trả lời.
Karl Morrison

4

Chia cho số không

Một điều cần lưu ý là max - mincó thể bằng không. Trong trường hợp này, bạn sẽ không muốn thực hiện phân chia đó.

Trường hợp điều này sẽ xảy ra là khi tất cả các giá trị trong danh sách bạn đang cố gắng bình thường hóa đều giống nhau. Để bình thường hóa một danh sách như vậy, mỗi mục sẽ được 1 / length.

// JavaScript
function normalize(list) {
   var minMax = list.reduce((acc, value) => {
      if (value < acc.min) {
         acc.min = value;
      }

      if (value > acc.max) {
         acc.max = value;
      }

      return acc;
   }, {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY});

   return list.map(value => {
      // Verify that you're not about to divide by zero
      if (minMax.max === minMax.min) {
         return 1 / list.length
      }

      var diff = minMax.max - minMax.min;
      return (value - minMax.min) / diff;
   });
}

Thí dụ:

normalize([3, 3, 3, 3]); // output => [0.25, 0.25, 0.25, 0.25]

Đây là một sự thay đổi tỷ lệ thành tổng 1, không phải trong phạm vi 0-1. Tôi chỉ nghĩ rằng câu trả lời là lạc đề.
ttnphns

Không phải vậy. normalize([12, 20, 10])đầu ra [0.2, 1.0, 0.0], giống như bạn sẽ nhận được với (val - min) / (max - min).
Rodrigo-silveira

@ Rodrigo-silveira Tôi không hiểu tại sao tất cả đầu ra 0,25. Không phải là tốt hơn tất cả 0,5 sao? Tất cả các mục bằng nhau, vì vậy nên được giữ ở giữa trong khoảng.
javierdvalle

0

Câu trả lời là đúng nhưng tôi có một gợi ý, nếu dữ liệu đào tạo của bạn đối mặt với một số ngoài phạm vi thì sao? bạn có thể sử dụng kỹ thuật squashing. nó sẽ được đảm bảo không bao giờ đi ra khỏi phạm vi. hơn là cái này

nhập mô tả hình ảnh ở đây

tôi khuyên bạn nên sử dụng cái này

nhập mô tả hình ảnh ở đây

với squashing như thế này trong min và max của phạm vi

nhập mô tả hình ảnh ở đây

và kích thước của khoảng cách ngoài phạm vi dự kiến ​​tỷ lệ thuận với mức độ tin cậy rằng sẽ có các giá trị ngoài phạm vi.

để biết thêm thông tin, bạn có thể google: xóa các số ngoài phạm vi và tham khảo sách chuẩn bị dữ liệu của "dorian pyle"


5
Vui lòng chỉnh sửa câu trả lời của bạn để sử dụng viết hoa như thông thường. Chữ thường nhất quán có vẻ gây cười hoặc hiệu quả, nhưng hầu như mọi người đều khó đọc hơn.
Nick Cox

3
Các minh họa không truyền đạt đầy đủ câu trả lời của bạn. Chính xác thì "kỹ thuật bẹp" là gì?
whuber

0

Thử đi. Nó phù hợp với quy mô chức năng

normalize <- function(x) { 
  x <- as.matrix(x)
  minAttr=apply(x, 2, min)
  maxAttr=apply(x, 2, max)
  x <- sweep(x, 2, minAttr, FUN="-") 
  x=sweep(x, 2,  maxAttr-minAttr, "/") 
  attr(x, 'normalized:min') = minAttr
  attr(x, 'normalized:max') = maxAttr
  return (x)
} 

7
Có một sự khác biệt quan trọng giữa câu trả lời này và câu trả lời đã được chấp nhận. Điều đó giải thích ý tưởng chính rõ ràng và trực tiếp và sau đó chỉ ra cách thực hiện nó trong một chương trình thường được sử dụng. Ngược lại, bạn chỉ đăng ở đây mã. Mặc dù tôi rất vui khi tin rằng đây là mã tốt (trong một số ngôn ngữ không giải thích được) trên diễn đàn này, chúng tôi thường không có một bó câu trả lời cho mọi câu hỏi giải thích cách thực hiện bằng mọi ngôn ngữ có thể hiểu được. Nếu không, chúng tôi sẽ có câu trả lời ở đây trong SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java. Python, v.v.
Nick Cox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.