변수를 0과 1 사이의 숫자로 나타내려고합니다. 변수는 고유 한 바인딩이없는 음이 아닌 정수입니다. 0을 0으로 매핑하지만 1 또는 0과 1 사이의 숫자로 무엇을 매핑 할 수 있습니까?
해당 변수의 기록을 사용하여 제한을 제공 할 수 있습니다. 이것은 최대 값이 증가하면 이전 통계를 다시 작성해야 함을 의미합니다. 이 작업을 수행해야합니까, 아니면 알아야 할 다른 트릭이 있습니까?
변수를 0과 1 사이의 숫자로 나타내려고합니다. 변수는 고유 한 바인딩이없는 음이 아닌 정수입니다. 0을 0으로 매핑하지만 1 또는 0과 1 사이의 숫자로 무엇을 매핑 할 수 있습니까?
해당 변수의 기록을 사용하여 제한을 제공 할 수 있습니다. 이것은 최대 값이 증가하면 이전 통계를 다시 작성해야 함을 의미합니다. 이 작업을 수행해야합니까, 아니면 알아야 할 다른 트릭이 있습니까?
답변:
이를 수행하는 가장 일반적인 트릭은 (예 : 연결주의 모델링) 쌍곡선 탄젠트를 '스 쿼싱 함수'로 사용하는 것 입니다. 모든 숫자를 -1과 1 사이의 간격에 자동으로 맞 춥니 다. 0에서 1까지. r
그리고 matlab
당신은 그것을 통해 얻습니다 tanh()
.
또 다른 스쿼시 함수는 로지스틱 함수 (이름은 Simon에게 감사함)이며 로 제공되며 범위를 0에서 1 (0에 0.5로 매핑 ) 을 제한합니다. 따라서 결과에 2를 곱하고 1을 빼서 0과 1 사이의 간격에 데이터를 맞추십시오.
다음은 두 함수 (붉은 색, 파란색 물류)를 그리는 간단한 R 코드입니다.
x <- seq(0,20,0.001)
plot(x,tanh(x),pch=".", col="red", ylab="y")
points(x,(1 / (1 + exp(-x)))*2-1, pch=".",col="blue")
"자주, 내 첫 번째 질문이 될 줄 왜 "이렇게 하시겠습니까? ", 나는 당신이 이미 질문에 대한 의견이 대답했습니다 보았다 나는 많은 다른 차원에서 함량을 측정하고 내가되고 싶어 특정 콘텐츠가 얼마나 관련성이 있는지 비교할 수 있습니다. 또한 설명이 가능하고 이해하기 쉬운 이러한 차원에 값을 표시하고 싶습니다. "
이것을 달성하기 위해 최대 값이 1이고 최소값이 0이되도록 데이터를 정규화 할 이유가 없으며 내 의견은 이것이 일반적으로 나쁜 생각이라고 생각 합니다. 최대 값 또는 최소값 은 모집단 분포를 나타내지 않는 특이 치일 수 있습니다 . @osknows 는 z- 점수 를 사용하는 것에 대한 의견을 나누는 것이 훨씬 좋습니다 . 점수 (일명 표준 점수)는 범위가 아닌 표준 편차를 사용하여 각 변수를 정규화합니다. 표준 편차는 특이 치의 영향을 덜받습니다. z 를 사용하려면 점수는 각 변수가 대략 정규 분포를 갖거나 최소한 대칭 분포를 갖는 것이 바람직하지만 (심하게 기울이지 않음) 필요한 경우 이를 달성하기 위해 먼저 적절한 데이터 변환을 적용 할 수 있습니다 . 가장 적합한 피팅을 찾아서 사용할 변환을 결정할 수 있습니다. Box-Cox 변환 .
mad()
rank()
ecdf()
ecdf(x)
Henrik 및 Simon Byrne의 좋은 제안 외에도 f (x) = x / (x + 1)을 사용할 수 있습니다. 비교하자면, 로지스틱 함수는 x가 커질수록 차이를 과장합니다. 즉, 로지스틱 함수의 경우 f (x) = x / (x + 1)보다 f (x)와 f (x + 1)의 차이가 커집니다. 그 효과를 원하거나 원치 않을 수 있습니다.
내 이전 게시물에는 0과 1 사이의 순위를 매기는 방법이 있습니다 . 분류 자 입력 상관에 대한 조언
그러나 내가 사용한 순위, Tmin / Tmax는 최소 / 최대 샘플을 사용하지만 최소 / 최대 모집단이 더 적절하다는 것을 알 수 있습니다. Z 점수도 조회
내가 일반적으로 사용하는 이것을 구현하는 두 가지 방법이 있습니다. 나는 항상 실시간 데이터로 작업하고 있으므로 지속적인 입력을 가정합니다. 의사 코드는 다음과 같습니다.
훈련 가능한 최소 최대 값 사용 :
define function peak:
// keeps the highest value it has received
define function trough:
// keeps the lowest value it has received
define function calibrate:
// toggles whether peak() and trough() are receiving values or not
define function scale:
// maps input range [trough.value() to peak.value()] to [0.0 to 1.0]
이 기능을 사용하려면 초기 교육 단계 (을 사용하여 calibrate()
)를 수행하거나 특정 간격으로 또는 특정 조건에 따라 재교육해야합니다. 예를 들어 다음과 같은 함수를 상상해보십시오.
define function outBounds (val, thresh):
if val > (thresh*peak.value()) || val < (trough.value() / thresh):
calibrate()
최대 값과
outBounds()
최저값 은 일반적으로 값을받지 않지만 현재 최고 값의 1.5 배 이상이거나 현재 최저값을 1.5로 나눈 값보다 작은 값을 수신calibrate()
하면이 함수가 호출되어 함수가 자동으로 재 보정됩니다.
과거 최소값 사용 :
var arrayLength = 1000
var histArray[arrayLength]
define historyArray(f):
histArray.pushFront(f) //adds f to the beginning of the array
define max(array):
// finds maximum element in histArray[]
return max
define min(array):
// finds minimum element in histArray[]
return min
define function scale:
// maps input range [min(histArray) to max(histArray)] to [0.0 to 1.0]
main()
historyArray(histArray)
scale(min(histArray), max(histArray), histArray[0])
// histArray[0] is the current element
A very simple option is dividing each number in your data by the largest number in your data. If you have many small numbers and a few very large ones, this might not convey the information well. But it's relatively easy; if you think meaningful information is lost when you graph the data like this, you could try one of the more sophisticated techniques that others have suggested.