항목 1
항목 1의 도전적인 부분은 도전 10 코드가 아니라 분위수 정의를 둘러싼 복잡성입니다. 먼저, 사물 분포를 독립적으로 유지하고 값을 직접 사용하는 대신 값의 순위 순서로 작업해 보겠습니다. 즉, 값을 오름차순으로 정렬하고 해당 순서로 나타나는 위치에 따라 번호를 지정합니다. 우리는 관계를 어떻게 할지 결정해야 합니다. 계속해서 순위를 매기거나 같은 값을 줄 수 있습니다. 전자의 단점은 하나 이상의 그룹에 동일한 값이 나타날 수 있다는 것입니다. 후자의 접근 방식의 단점은 그룹당 항목 수가 덜 균형을 이룰 수 있다는 것입니다. 이 두 가지 접근 방식은 순위 그리고 랭킹 동점 JSL 함수. 우리는 두 번째 접근 방식에서 관계에 어떤 가치를 부여할 것인지에 대해 이야기하지 않았습니다. 우리는 그들 모두에게 다음 순차 순위 값을 줄 수 있습니다. 또는 순차적으로 순위가 지정된 값을 평균화할 수 있습니다. 두 경우 모두, 우리는 아마도 다음 순차 비동률 값에 동률이 없었다면 받았을 순위를 주고 싶을 것입니다. 랭킹 동점 순위를 평균하고 단순화를 위해 이것을 사용할 것입니다.
다음 질문은 그룹을 나누는 방법입니다. 우리는 그것들을 가능한 한 동등하게 나누려고 노력할 수 있습니다. 이를 수행하는 간단한 방법은 적어도 바닥 ( N / NS ) 각 그룹의 항목(여기서 N 총 항목 수와 NS 는 분위수 그룹의 수입니다). 어디에 둘지 결정해야 할 것입니다. N – NS * 바닥 ( N / NS ) < NS 추가 값. 아래 코드는 이 모든 것을 간단하고 깔끔하게 처리합니다.
상한(랭킹(inVec)/(N 행(inVec)/quant))
어디 인벡 는 입력(열) 벡터이고 퀀트 분위수 그룹의 수.
위의 코드로 인해 묶인 값이 그룹 간에 분할될 수 있습니다. 이를 방지하기 위해 교체할 수 있습니다. 순위 ~와 함께 랭킹 동점 . 전체 기능의 예는 다음과 같습니다.
quantileGroup = Function({inVec,quant=10,method=1},{outVec,sumTblRef,ranks},
inVec = Shape(inVec,N Row(invec)*N Col(inVec),1);
If(method ==1,
outVec = Ceiling(Ranking(inVec)/(N Row(inVec)/quant)),
outVec = Ceiling(Ranking Tie(inVec)/(N Row(inVec)/quant))
);
outVec;
);
항목 2
적은 수의 그룹을 집계할 수 있는 여러 가지 방법이 있습니다. 절대적인 관찰 수, 상대적인 관찰 수(예: 가장 큰 그룹의 10% 미만 카운트를 가진 그룹), 총 그룹 수 고정 등 장점과 단점이 있습니다. 유연한 솔루션을 제공하기 위해 슬라이더를 사용하여 조정할 수 있는 막대 차트로 관리되는 대화형 및 시각적 접근 방식을 선택했습니다. 이렇게 하면 좋아 보이는 그룹 분포를 찾을 때까지 슬라이더를 앞뒤로 이동할 수 있습니다. 그룹 수가 많을 때 코드가 빨라지는 것이 어려웠습니다. 간단하게 하기 위해 데이터 테이블 작업 및 플랫폼( 자동 재계산 켜짐). 다음은 이것이 전후에 어떻게 보일 수 있는지에 대한 예입니다.
전에

후에

일반적으로 이 코드는 그룹에서 요약 테이블을 작성하고 그룹 수( N 행 열)로 주파수 변하기 쉬운. 이렇게 하면 훨씬 더 클 수 있는 원래 테이블에서 값을 업데이트할 필요가 없습니다. 코드는 다음에서 찾을 수 있습니다. 집계 그룹.JSL . 요약의 원래 그룹 값 목록은 카운트(순위)의 벡터 순위 순서와 함께 전역 변수 그룹에 저장됩니다. 슬라이더를 움직이면 집계 낮은 수 그룹의 요청 번호( n그룹 ) 슬라이더의 위치를 기준으로 전달됩니다. 그룹 수는 순위 벡터에서 쉽게 선택할 수 있습니다. 예를 들어, 총 10개의 그룹이 필요한 경우 순위가 10 이상인 원래 그룹의 값은 다른 모든 그룹이 동일하게 유지되는 집계된 그룹 값(예: "기타")으로 설정됩니다. 테이블이 정렬되어 있기 때문에 행 10부터 값을 변경하기만 하면 됩니다.
항목 3 / 항목 4
이 항목에 대한 나의 동기는 항목 4의 선구자였습니다. 연관 배열(AA)에서 무언가를 찾는 것이 다음을 사용하는 것보다 훨씬 빠릅니다. 록 . 209,405 단어로 AA 만들기 단어 목록.JMP 내 컴퓨터에서 12초 미만이 걸렸습니다. 아래 표는 다음 중 하나를 사용하여 표에서 임의의 단어 목록을 찾는 시간을 보여줍니다. 록 또는 AA.
N 단어
|
위치(초)
|
연관 배열(초)
|
1
|
0.19
|
0.000045
|
5
|
0.91
|
0.000127
|
10
|
1.78
|
0.000244
|
25
|
4.51
|
0.000592
|
50
|
9.11
|
0.001019
|
70
|
12.47
|
0.001454
|
100
|
17.82
|
0.002155
|
70단어보다 긴 목록의 경우 AA를 구축하는 것이 좋습니다. 이 두 가지 접근 방식을 테스트하는 데 사용한 코드는 Loc 대 AA.JSL .
AA를 검색 가능한 데이터 구조로 사용하면 장단점이 있습니다. 플러스 측면에서는 다른 AA를 포함하여 모든 값을 AA 키와 연결할 수 있습니다. 단점은 키가 고유해야 하고(내 옵션에서는 큰 문제가 아님), 더 중요한 것은 검색 값이 키 목록에 없는 경우 검색 프로세스를 보강해야 한다는 것입니다. 즉, 가능한 모든 검색 값이 선험적으로 알려져 있으면 구현이 비교적 쉽지만 그렇지 않은 경우에는 조금 더 까다롭습니다. 이것은 우리가 그것들을 사용할 수 없다는 것을 의미하지는 않습니다. 우리는 조금 더 교묘해질 필요가 있습니다. 아래 코드와 같은 것이 작동합니다. 항목 3에 태그된 게시물에 언급된 경우 . 조금 더 복잡하고 경우에 따라 더 느릴 수 있지만 매우 유연합니다. 연관 배열의 내용을 수정하기만 하면 조회 사전이 변경되는 상황에 쉽게 적용할 수 있습니다.
aaMap = Associative Array(
{"1","2","3","4","5","6","7","8","9","0","M","K"},
{"1","2","3","4","5","6","7","8","9","0","e6","e3"}
);
findAndReplace = Function({inList,aaMap},
outNums = Transform Each({nextString},inList,Output("Matrix"),
nextChars = Items(nextString,"");
Num(Concat Items(Transform Each({nextChar},nextChars,aaMap[nextChar]),""));
);
outNums
);
Les Misérables의 영어 번역에 나오는 모든 단어의 사전을 만드는 것과 같이 좀 더 일반적이고 더 큰 문제를 해결하고 싶다면 어떻게 해야 할까요? 단어가 표준 ASCII 문자 집합(예: 발음 구별 부호가 있는 문자) 이외의 문자를 포함하여 알파벳 문자로만 구성되어 있다고 가정하는 것으로 시작하겠습니다. 다른 모든 것은 구분 기호입니다. 여기서 문제는 접하게 될 구분 문자가 무엇인지 확신할 수 없다는 것입니다. 단어를 구성하는 문자를 알고 있으므로 목록에 없으면 구분 기호라고 가정할 수 있습니다.
패턴 매칭에는 사전을 만드는 데 사용할 단어를 찾기 위한 완벽한 도구가 있습니다. 팻 스팬 그리고 팻 브레이크 .우리는 사용할 수 있습니다 단어 하지만 각 항목에 포함된 구분 기호가 있는지 확인해야 합니다. 패턴 일치를 사용하면 한 번에 모든 작업을 수행할 수 있습니다. 코드는 아래에 있습니다. 전체 프로세스는 8~9초가 소요되었습니다. 코드를 다른 텍스트에 적용하려면 추가 문자를 포함하고 파일을 다른 인코딩으로 저장하는 등 일부 미세 조정이 필요할 수 있습니다(확장 ASCII 문자를 캡처하기 위해 utf-16을 사용했습니다). 나는 빚을지고있다 @Craige_Hales 작동하도록 고군분투 한 후 이것을 도와 주셔서 감사합니다. Les Misérables의 텍스트 파일은 프로젝트 구텐베르크 . 당신은 그것을 찾을 수 있습니다 여기 .
bigText = Load Text File("Les Misérables.txt");
aaLookup = Associative Array();
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZé´É";
wordLoc = 0;
Pat Match(bigText,
Pat Repeat(
(
Pat Pos() >> nextLoc
+ Pat Span( letters ) >> nextWord
+ Pat Test(
Try(
Insert Into(aaLookup[Lowercase(nextWord)],nextLoc),
aaLookup<<INSERT></INSERT>
멋진! NS 노력하다 () 연관 배열에 사용 중인 구성 에 집어 넣다() 기존 요소를 먼저 테스트하는 것보다 빠를 수 있습니다.
내가 독서 동아리에 들어갈 만큼 젊었을 때 여행을 많이 갔던 친구 중 한 명이 요세미티 , 내가 한 번도 만난 적이 없는. 나는 그의 4음절 발음에 놀랐고, 선생님이 유쾌하게 놀라는 것을 알아차렸던 것을 기억합니다.
몇 년 후, 누군가가 나에게 말할 수 있다고 말했습니다. 절름발이는 롭 그리고 주의를 끌기에 충분할 만큼 정확한 연극의 이름을 얻으십시오.