문제

1에서 30,000 사이의 데이터 세트가 있습니다.

0.1에서 10이되도록 정상화하고 싶습니다.

그렇게하는 가장 좋은 방법/기능은 무엇입니까?

샘플 코드를 줄 수 있다면 크게 감사하겠습니다!

도움이 되었습니까?

해결책

다음은 원한다고 가정하는 코드 스 니펫입니다. 선의 표준화. 매우 단순한 버전 (직선 코드, 메소드 없음)이므로 "작동 방식"을보고 적용 할 수 있습니다.

xmin = 1.0
xmax = 30000.0
ymin = 0.1
ymax = 10.0

xrange = xmax-xmin
yrange = ymax-ymin

y = ymin + (x-xmin) * (yrange / xrange) 

그리고 여기서는 기능으로 수행됩니다.

def normalise(x, xmin, xmax, ymin, ymax)
  xrange = xmax - xmin
  yrange = ymax - ymin
  ymin + (x - xmin) * (yrange.to_f / xrange) 
end

puts normalise(2000, 1, 30000, 0.1, 10) 

(참고 : to_f 정수 부문의 블랙홀에 빠지지 않도록합니다)

다른 팁

다음은 배열 최소를 0.0으로, 최대 1.0을 설정하는 일반적인 경우의 루비 방식입니다.

class Array
  def normalize!
    xMin,xMax = self.minmax
    dx = (xMax-xMin).to_f
    self.map! {|x| (x-xMin) / dx }
  end
end

a = [3.0, 6.0, 3.1416]
a.normalize!
=> [0.0, 1.0, 0.047199999999999985]

0과 1 이외의 최소 최대의 경우 인수를 추가하십시오. normalize! Elfstrom의 대답의 방식으로.

이것은 컬렉션 번호를 확장하는 잘 알려진 방법입니다. 더 정확한 이름을 가지고 있지만 기억할 수없고 Google에 실패합니다.

def scale(numbers, min, max)
    current_min = numbers.min
    current_max = numbers.max
  numbers.map {|n| min + (n - current_min) * (max - min) / (current_max - current_min)}
end

dataset = [1,30000,15000,200,3000]
result = scale(dataset, 0.1, 10.0)
=> [0.1, 10.0, 5.04983499449982, 0.165672189072969, 1.08970299009967]
scale(result, 1, 30000)
=> [1.0, 30000.000000000004, 15000.0, 199.99999999999997, 3000.0000000000005] 

보시다시피, 반올림 문제를 알고 있어야합니다. 정수 부서가 결과를 손상시키기 때문에 Min & Max로 정수를 얻지 않아야 할 수도 있습니다.

x = x / 3030.3031 + 0.1

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top