2017-03-02 4 views
2

그래프에서 데이터를 읽고 데이터 포인트 간의 분산을 표시하기 위해 정규화 된 특정 빈도로 값을 재생하는 프로그램을 작성 중입니다.대수 스케일을 사용하여 정규화를 왜곡하는 방법은 무엇입니까?

테스트에서 "허용 가능한"사운드 범위는 사용하기에 너무 높지도 낮지 않은 주파수 범위에 대해 200 ~ 3800 사이에있는 것으로 나타났습니다. 즉, 모든 데이터를 해당 숫자 범위로 변환해야합니다. 여기에 그 지침이 주어진 해결책이 있습니다.

function normalize(enteredValue, minEntry, maxEntry, normalizedMin, normalizedMax) { 

var mx = (enteredValue-minEntry)/(maxEntry-minEntry); 
var preshiftNormalized = mx*(normalizedMax-normalizedMin); 
var shiftedNormalized = preshiftNormalized + normalizedMin; 

return shiftedNormalized; 

} 

이 방법은 효과가 있지만 특정 경우에는 약간의 문제가 있습니다. 사용자가 동일한 데이터 세트에서 매우 작은 값과 매우 큰 값을 갖는 경우.

간단한 예 : A 회사의 경우 1 달러, B 회사의 경우 10 억 달러의 이익을 얻을 수 있습니다. C 회사와 D 회사 등의 경우 이익이 극단적 인 경우와 매우 다릅니다. 그러나 C 사가 5 천만 달러의 이익을 얻고 있다고 가정 해 봅시다. 이것은 1 달러 이상이고 10 억 달러보다 훨씬 적으며 많은 문제가되지 않습니다. 그러나 D가 2 만 달러의 이익을 얻는다면 문제가 발생할 수 있습니다.

1 = 200.0000036

20,000 = 200.072

50,000,000 = 380

: 정상화

숫자는이 (A 최소로 최대로서 3800, 200을 사용) 될

10 억 = 3800

여기서 명백한 문제를 볼 수 있습니다. 위의 함수를 사용하여 사운드를 원하는 주파수 범위로 정규화하면 데이터에 큰 차이가있는 큰 데이터 세트가 그래프에 표시되는 것을 왜곡 할 수 있습니다. 정규화가 큰 데이터를 더 작은 범위의 숫자로 압축하는 방법 때문에 최대 및 최소 수가 매우 멀리 떨어져있을 때만 문제가됩니다.

두 가지 가능한 해결책 :

  • 는 사용자가 데이터 세트에있을 수있는 최대 수를 설정합니다. 이는 쉽게 해결할 수 있지만, 캡에있는 모든 것이 단순히 가장 높은 빈도로 재생되기 때문에 은 CSV 파일의 데이터를 자동으로 구문 분석 할 때 프로그램의 기능을 제한합니다.

  • 두 번째 해결 방법은 복잡하며 아직 수행 할 방법이 확실하지 않습니다. 이는 사용자 또는 누군가가 올바른 방향으로 나를 가리켜 주려는 것입니다. 나는 어떤 종류의 로그를 사용하여 더 큰 데이터를 덜 중요하게 만들기 위해 스케일링을 사용하면 좋은 솔루션이라고 생각합니다. 내가이 의미하는 것은 여기이 그래프 같은 것입니다 :

변명 불쌍한 내 페인트 드로잉 기술,하지만 당신은 내가 무슨 뜻인지 확인할 수 있습니다. 숫자가 커질수록 중요도는 점차 낮아집니다. 숫자가 서로 관련하여 어떻게 작용하는지는 아니지만 많은 사람들에 대한 인간의 인식이 이미 막연하다고 생각합니다. 따라서 더 작은 숫자보다 큰 숫자가 더 가깝게 들리는 것이 낫습니다. (예 : 1, 2 만).

당신은 어떻게 생각하십니까?

편집 : 로그베이스 10을 취하는 것에 대해 언급하는 코멘트 중 하나가 올바른 경로에 있다고 생각하지만 숫자가 너무 가까워서 작은 데이터 포인트에서는 작동하지 않습니다. IE 로그 1은 1이고 로그 10은 2입니다. 1과 2는 너무 가깝기 때문에 차이점을들을 수 없습니다.

+1

저는 수학에있어 제 생각을 표현하는 것이 그리 좋지는 않지만 '정상적인'정규화 대신에 로그베이스 10을 대신 사용하는 것이 어떻습니까? 그래서 1은 1, 10은 2, 100은 3이 될 것인가? 나는 이것이 숫자를 훨씬 더 줄일 것이라고 생각한다. –

+0

그 문제는 내가 숫자가 다음 숫자보다 높을 때 사용자가 알 수있는 차이가 충분해야한다는 것입니다. 주파수가 1에서 2로 변경되면 대부분의 사람들의 귀에 등록되지 않습니다. 로그베이스 10을 사용하는 것은 해결책의 일부이지만 전체가 아닙니다. – Remixt

답변

1

이 시도 :

function normalize(enteredValue, minEntry, maxEntry, normalizedMin, normalizedMax) { 

var mx = (Math.log((enteredValue-minEntry))/(Math.log(maxEntry-minEntry))); 
var preshiftNormalized = mx*(normalizedMax-normalizedMin); 
var shiftedNormalized = preshiftNormalized + normalizedMin; 

return shiftedNormalized; 

} 

이도 분포에서해야한다. 당신이 준 동일한 매개 변수와

, 여기에 새로운 값은 다음과 같습니다

1 : 200

20000 : 1920.4119982655923

50000000 : 3279.588001734408

10 억 = 3800

이것은 log10을 사용하고 있습니다. 더 많거나 적은 대수 효과의 경우 log2 또는 log16과 같은 다른 기준을 사용하십시오.

+0

원래 게시물의 편집 내용을 참조하십시오. 나는 이것이 부분적인 해결책이라고 생각하지만, 더 작은 숫자에 대해서는 문제를 일으킬 것이다. – Remixt

+0

10 억 개 중 1 개는 너무 가깝기 때문에 사용자가 차이점을 듣지 않아야합니다. 다른 것을 찾지 않는 한? 보다 미세한 해상도가 필요한 경우 더 작은 최대 입력을 사용하십시오. –

+0

그래서 문제는 사용자가 어떤 데이터를보고 있는지 알 수 없다는 것입니다. 따라서 그들이 필요로하는 것에 상대적이어야합니다. 나는 데이터가 1에서 10로 변한 다음 10에서 20,000으로 극단적으로 바뀌면 그들에게도 변화가 생길 수 있기를 바랄 것이다. – Remixt

관련 문제