데이터를 0-1 범위로 정규화하는 방법은 무엇입니까?


265

나는 정상화에서 길을 잃었습니다. 누구든지 나를 안내 할 수 있습니까?

최소값과 최대 값이 각각 -23.89 및 7.54990767입니다.

5.6878의 값을 얻으면이 값을 0에서 1의 스케일로 어떻게 조정할 수 있습니까?


8
= (value-min) / (max-min)
Angelo

3
이 스레드를 읽는 데 도움이 될 수 있습니다. how-to-verify-a-distribution-is-normalized . 그 질문에 대답하면이 Q를 삭제할 수 있습니다. 그렇지 않은 경우 Q를 편집하여 여전히 이해할 수없는 것을 지정하십시오.
gung

1
보호 설명 :이 질문은 코드 솔루션 만 포함하는 추가 답변을 모으고 있습니다. 이것들은 일부 독자에게는 흥미 롭거나 유용 할 수 있지만, 코드 솔루션의 저장소를 제공하는 것은 CV의 목표가 아닙니다.
Nick Cox

1
제공된 솔루션은 선형 대비 값을 고려합니다. 예를 들어 출력에 대해 균일 한 확률을 달성하는 것과 같은 다른 정규화를 원하십니까?
meduz

답변:


299

데이터를 정규화하려면 다음을 제안하고 간단히 계산하면됩니다.

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

여기서 및 는 이제 정규화 된 데이터입니다. 개념 증명 (요청하지는 않았지만)에는 이 점을 설명하기위한 코드와 그래프가 있습니다.x=(x1,...,xn)ziithR

여기에 이미지 설명을 입력하십시오

# 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
두 가지 완전히 다른 모양의 히스토그램이 illustrate the point(올바른) 대답에 어떻게 작용하는지 궁금합니다 .
ttnphns

12
@ttnphns 히스토그램의 비닝으로 인해 서로 다르게 보입니다. 그러나 요점은 원래 값이 -100에서 100 사이에 있었고 정규화 후에는 0과 1 사이에 있다는 것을 보여주었습니다. 다른 그래프를 사용 하여이 가정 또는 요약 통계를 표시 할 수있었습니다.

20
@ttnphns의 부드러운 너지는 (간단한) 아이디어를 설명하는 덜 복잡한 수단을 사용하는 것뿐만 아니라 더 직접적으로 관련된 그림이 여기에 도움이 될 수 있다는 힌트로 (나는 의심합니다) 권장합니다. OP가 제공 한 최소값과 최대 값에 적용될 때 변환을 그래프로 표시하는보다 간단한 방법을 찾아 두 가지 방법을 모두 사용할 수 있습니다.
whuber

1
0-1 대신 사용자 정의 범위로 "정규화"하는 방법이 있습니까?
John Demetriou

1
@JohnDemetriou 가장 깨끗한 솔루션은 아니지만 정규화 된 값을 스케일링하여 그렇게 할 수 있습니다. 예를 들어 0-100 범위를 원하면 각 숫자에 100을 곱하면됩니다. 10-100과 같이 0으로 시작하지 않는 범위를 원하면 MAX-MIN으로 스케일링 한 다음 MIN을 추가하여 얻은 값입니다. 따라서 90으로 확장 한 다음 10을 더하십시오. 원하는 대부분의 사용자 지정 범위에 충분합니다.
Alexander Rossa

47

minmax 를 관찰 한 데이터 값을 새로운 임의 범위 인 min ' 에서 max' 로 선형으로 스케일링하는 일반적인 한 줄 공식 은 다음과 같습니다.

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

9
이것은 정확하지만 효율적이지 않습니다. 선형 변환이므로 미리 계산 a하고 b상수를 적용한 다음 적용하면됩니다 newvalue = a * value + b. a = (max'-min')/(max-min)b = max - a * max
마크 Lakata

1
이것을 인용하는 방법을 알고 있습니까? 어딘가에 "원본"참조가 있습니까?
Trefex

3
@MarkLakata 약간 (오타?) 수정 : b = max' - a * max또는b = min' - (a * min)
Nick Nick

@ 닉-예. 나는 '
Mark Lakata

당신이 당신의 정상화를 비교시겠습니까 여기 se.mathworks.com/matlabcentral/answers/...는 방정식을 즉 u = -1 + 2.*(u - min(u))./(max(u) - min(u));.
Léo Léopold Hertz 준영

13

정규화를위한 PHP 구현은 다음과 같습니다.

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

그러나 인공 신경망을 구축하는 동안 정규화 된 출력을 원래 데이터로 다시 변환하여 그래프에 대한 읽기 쉬운 출력을 얻어야했습니다.

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

비정규 화는 다음 공식을 사용합니다.

x(maxmin)+min


2
이 답변과 이미 수락 된 답변간에 중요한 차이점이 있습니다. 그것은 주요 아이디어를 명확하고 직접적으로 설명하고 일반적으로 사용되는 하나의 프로그램에서 그것을 수행하는 방법을 보여줍니다. 반대로 여기에 코드 만 게시합니다. 나는이 포럼에서 좋은 코드 (PHP를 작성하지 않음)라고 생각하지만, 일반적으로 생각할 수있는 모든 언어로 코드를 작성하는 방법을 설명하는 모든 질문에 대한 답변이 없습니다. 그렇지 않으면 SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java로 답을 얻을 수 있습니다. 파이썬, 등, 등
닉 콕스

2
나는 이것이 유일한 차이점이라고 생각하지 않습니다. 내 코드에서는 정규화 값을 정규화 이전의 값으로 반환하는 방법도 보여주었습니다. 나는 이것이 그 대답의 가치가 있다고 생각합니다.
jankal

1
코드 만 게시하는 것이 여전히 사실입니다. 그렇지 않으면 독자가 코드를 읽어야 코드가 무엇인지 확인해야하기 때문에 주석에서 특별한 코드의 장점을 강조해야한다고 생각합니다. 아마도 스케일링 반전은 (a) 원래 값을 덮어 썼지 만 (b) 사용자가 최소값과 최대 값을 저장하는 것을 신중하게 기억 한 경우에만 사용됩니다. 위에서 언급했듯이 CV는 코드 예제의 저장소가되는 것을 목표로하지 않습니다.
Nick Cox

값을 복원해야하는 경우 몇 가지 문제가 있습니다. 예를 들어 Nueral Networks ... 그러나 데이터 분석 방식에서는이 대답이 매우 나쁩니다.
jankal

3
@ NickCox 나는 그의 대답이 받아 들인 것보다 더 만족 스럽다는 것을 알았습니다.
Karl Morrison

4

0으로 나누기

명심해야 할 것은 max - min0과 같습니다. 이 경우 해당 분할을 수행하지 않을 것입니다.

이런 상황이 발생하는 경우 정규화하려는 목록의 모든 값이 동일한 경우입니다. 이러한 목록을 정규화하기 위해 각 항목은입니다 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;
   });
}

예:

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

이것은 0-1 범위가 아닌 합계 1로 크기를 조정합니다. 나는 그 대답이 주제에 맞지 않다고 생각합니다.
ttnphns

별로. normalize([12, 20, 10])출력 [0.2, 1.0, 0.0]과 동일합니다 (val - min) / (max - min).
rodrigo-silveira

@ rodrigo-silveira 왜 모든 0.25 출력을 보지 못합니다. 0.5보다 좋지 않습니까? 모든 항목이 동일하므로 간격을 중앙에 유지해야합니다.
javierdvalle

0

대답은 맞지만 제안 사항이 있습니다. 훈련 데이터가 범위를 벗어난 숫자에 직면하면 어떻게됩니까? 스 쿼싱 기술을 사용할 수 있습니다. 절대 범위를 벗어나지 않아야합니다. 이보다는

여기에 이미지 설명을 입력하십시오

나는 이것을 사용하는 것이 좋습니다

여기에 이미지 설명을 입력하십시오

최소 및 최대 범위에서 이와 같이 스쿼시

여기에 이미지 설명을 입력하십시오

범위를 벗어난 것으로 예상되는 간격의 크기는 범위를 벗어난 값이있을 것이라는 신뢰도에 정비례합니다.

더 많은 정보를 원하시면 google : 범위를 벗어난 숫자를 없애고 "dorian pyle"의 데이터 준비 책을 참조하십시오


5
대문자를 대문자로 사용하려면 답을 수정하십시오. 일관된 소문자는 재미 있거나 효율적으로 보일 수 있지만 거의 모든 사람이 읽기가 더 어렵습니다.
Nick Cox

3
그림이 답을 제대로 전달하지 못합니다. "스 쿼싱 기술"이란 정확히 무엇입니까?
whuber

0

이 시도. 기능 스케일 과 일치

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
이 답변과 이미 수락 된 답변간에 중요한 차이점이 있습니다. 그것은 주요 아이디어를 명확하고 직접적으로 설명하고 일반적으로 사용되는 하나의 프로그램에서 그것을 수행하는 방법을 보여줍니다. 반대로 여기에 코드 만 게시합니다. 나는이 포럼에서 좋은 코드 (설명되지 않은 언어로 된 코드)라고 생각하지만 우리는 일반적으로 생각할 수있는 모든 언어로 코드를 작성하는 방법을 설명하는 모든 질문에 대한 답을 가지고 있지 않습니다. 그렇지 않으면 SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java로 답을 얻을 수 있습니다. 파이썬 등
Nick Cox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.