0에서 1 사이의 숫자로 제한되지 않은 변수를 나타내는 방법


28

변수를 0과 1 사이의 숫자로 나타내려고합니다. 변수는 고유 한 바인딩이없는 음이 아닌 정수입니다. 0을 0으로 매핑하지만 1 또는 0과 1 사이의 숫자로 무엇을 매핑 할 수 있습니까?

해당 변수의 기록을 사용하여 제한을 제공 할 수 있습니다. 이것은 최대 값이 증가하면 이전 통계를 다시 작성해야 함을 의미합니다. 이 작업을 수행해야합니까, 아니면 알아야 할 다른 트릭이 있습니까?


6
감소하지 않는 함수 가 트릭을 수행하므로 유연성이 많이 있습니다. 그러나 응용 프로그램에 따라 일부 방법이 다른 방법보다 좋습니다. 그러한 표현을 구하려는 당신의 목적은 무엇입니까? [0,)[0,1]
whuber

1
여러 차원에서 콘텐츠를 측정하고 있으며 특정 콘텐츠가 얼마나 관련성이 있는지 비교할 수 있기를 원합니다. 또한 설명 가능하고 쉽게 이해할 수있는 이러한 차원에 값을 표시하려고합니다.
스펜서

1
@ 스펜서 정확히 어떻게 내용과 "관련성"을 측정하고 있습니까? 예를 들어, 임의의 스케일에서, 카운트, 비율, 뷰의 빈도, 다른 내용과의 상관 관계 등. 다른 유형의 측정은 다른 종류의 재 표현으로부터 유리하다.
whuber

1
임의의 스케일로 측정하고 있습니다. 내용이 몇 살입니까? 컨텐츠를 수신 한 "포인트"수입니다. 컨텐츠의 도메인에서 자체적으로보고 된 "관심".
스펜서

2
사용할 수있는 가장 간단한 변환 중 하나는 데이터를 Quantile 점수로 변환하는 것입니다.
charles.y.zheng

답변:


34

이를 수행하는 가장 일반적인 트릭은 (예 : 연결주의 모델링) 쌍곡선 탄젠트를 '스 쿼싱 함수'로 사용하는 것 입니다. 모든 숫자를 -1과 1 사이의 간격에 자동으로 맞 춥니 다. 0에서 1까지. r그리고 matlab당신은 그것을 통해 얻습니다 tanh().

또 다른 스쿼시 함수는 로지스틱 함수 (이름은 Simon에게 감사함)이며 로 제공되며 범위를 0에서 1 (0에 0.5로 매핑 ) 을 제한합니다. 따라서 결과에 2를 곱하고 1을 빼서 0과 1 사이의 간격에 데이터를 맞추십시오.f(x)=1/(1+ex)

다음은 두 함수 (붉은 색, 파란색 물류)를 그리는 간단한 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로 매우 빠르게 진행되므로 다음으로해야 할 일은이 정보를 확장하여 경계를 벗어나지 않고 그 역사를 기반으로 할 수있는 흥미로운 범위에 집중하는 것입니다. 한계에 도달했습니다.
Russell Gallop

25

"자주, 내 첫 번째 질문이 될 줄 "이렇게 하시겠습니까? ", 나는 당신이 이미 질문에 대한 의견이 대답했습니다 보았다 나는 많은 다른 차원에서 함량을 측정하고 내가되고 싶어 특정 콘텐츠가 얼마나 관련성이 있는지 비교할 수 있습니다. 또한 설명이 가능하고 이해하기 쉬운 이러한 차원에 값을 표시하고 싶습니다. "

이것을 달성하기 위해 최대 값이 1이고 최소값이 0이되도록 데이터를 정규화 할 이유가 없으며 내 의견은 이것이 일반적으로 나쁜 생각이라고 생각 합니다. 최대 값 또는 최소값 은 모집단 분포를 나타내지 않는 특이 치일 수 있습니다 . @osknows z- 점수사용하는z 것에 대한 의견을 나누는 것이 훨씬 좋습니다 . 점수 (일명 표준 점수)는 범위가 아닌 표준 편차를 사용하여 각 변수를 정규화합니다. 표준 편차는 특이 치의 영향을 덜받습니다. z 를 사용하려면zz 점수는 각 변수가 대략 정규 분포를 갖거나 최소한 대칭 분포를 갖는 것이 바람직하지만 (심하게 기울이지 않음) 필요한 경우 이를 달성하기 위해 먼저 적절한 데이터 변환을 적용 할 수 있습니다 . 가장 적합한 피팅을 찾아서 사용할 변환을 결정할 수 있습니다. Box-Cox 변환 .


[0,1]

1
mad()rank()ecdf()ecdf(x)ppx1/nx1
Karl Ove Hufthammer

10

모든 S 자형 함수가 작동합니다.


erf는 파생 함수로 사용하고 싶지 않다면 매우 편리한 기능이 아닙니다.

나는 약간의 조정으로 간단한 물류 함수를 사용했습니다 : (1 / (1 + java.lang.Math.exp (-1 * (factor * i)))-0.5) * 2. 0.05의 인수를 선택했습니다. 0에서 수백 사이의 i에서 잘 작동하는 것 같습니다.
Jilles van Gurp

1.0 / (1.0 + exp (-1.69897 * (x-mean (x)) / sd (x)))는 pnorm에 가까운 근사치
Chris

3

Henrik 및 Simon Byrne의 좋은 제안 외에도 f (x) = x / (x + 1)을 사용할 수 있습니다. 비교하자면, 로지스틱 함수는 x가 커질수록 차이를 과장합니다. 즉, 로지스틱 함수의 경우 f (x) = x / (x + 1)보다 f (x)와 f (x + 1)의 차이가 커집니다. 그 효과를 원하거나 원치 않을 수 있습니다.


1

내 이전 게시물에는 0과 1 사이의 순위를 매기는 방법이 있습니다 . 분류 자 ​​입력 상관에 대한 조언

그러나 내가 사용한 순위, Tmin / Tmax는 최소 / 최대 샘플을 사용하지만 최소 / 최대 모집단이 더 적절하다는 것을 알 수 있습니다. Z 점수도 조회


1

pnorm을 제안하는 다른 답변에 추가하려면 ...

잠재적으로 매개 변수를 선택하는 최적의 방법을 위해 pnorm에 대한이 근사값을 제안합니다.

1.0/(1.0+exp(-1.69897*(x-mean(x))/sd(x)))

pnormish

이것은 본질적으로 Softmax 정규화입니다.

핀치의 참조 Pnorm


1

내가 일반적으로 사용하는 이것을 구현하는 두 가지 방법이 있습니다. 나는 항상 실시간 데이터로 작업하고 있으므로 지속적인 입력을 가정합니다. 의사 코드는 다음과 같습니다.

훈련 가능한 최소 최대 값 사용 :

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

This can all be implemented in Max/MSP/Jitter with the [peak] and [trough] objects for the first example and with [jit.3m] for the second example.
terrace

0

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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.