หมายถึง Interquartile


26

งาน

ที่กำหนด (โดยวิธีใด ๆ ) ที่จัดเรียงลอยชุดข้อมูลที่จุดกลับ (โดยวิธีการใด ๆ และภายใน 1 ‰ของค่าที่ถูกต้อง) เดอะinterquartile เฉลี่ย

หนึ่งอัลกอริทึมที่เป็นไปได้

  1. ทิ้งจุดข้อมูลต่ำสุดและสูงสุดของจุดข้อมูล
  2. คำนวณค่าเฉลี่ย (ผลรวมหารด้วยจำนวน) ของจุดข้อมูลที่เหลือ

หมายเหตุ:หากขนาดชุดข้อมูลไม่สามารถแบ่งออกเป็นสี่ส่วนเท่า ๆ กันคุณจะต้องชั่งน้ำหนักชุดข้อมูลที่ใช้ร่วมกันโดยชุดย่อย ดูตัวอย่างการประเมินผล 2ด้านล่าง

ตัวอย่างการประเมินผล 1

รับ {1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38}

  1. การนับข้อมูลคือ 12 ดังนั้นเราจึงลบดาต้าพอยน์ต่ำสุดและสูงสุด 3 รายการ:
    { 1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38 }
  2. ค่าเฉลี่ยของ datapoints ที่เหลืออีก 6 ตัว:
    (5 + 6 + 6 + 7 + 7 + 8) / 6 = 6.5

ตัวอย่างการประเมินผล 2

รับ {1, 3, 5, 7, 9, 11, 13, 15, 17}

  1. จำนวนคือ 9 ดังนั้นแต่ละไตรมาสจะมีดาต้าพอยน์2¼:
    { 1, 2, (0.25 × 5), (0.75 × 5), 7, 9, 11, (0.75 × 13), (0.25 × 13), 15, 17 }
  2. ค่าเฉลี่ยของดาต้าพอยน์ 4.5 ที่เหลือ:
    (0.75 × 5 + 7 + 9 + 11 + 0.75 × 13) / 4.5 = 9

คำตอบ:


5

Scilab, 8 ไบต์

trimmean

ดูเอกสาร โดยค่าเริ่มต้นdiscard=50ดังนั้น IQM จึงถูกคำนวณ

แก้ไข: คุณจะรู้ว่านี้เป็นที่น่ารำคาญในตัวคำตอบดังนั้นฉันทำเครื่องหมายว่าเป็น CW


ฉันเดาว่านี่จะเป็นผู้ชนะ ทำได้ดี.
อดัม

8

Pyth , 11 10 ไบต์

.o> <lQS * 4QL
.OsPtc4S * 4

ชุดทดสอบ

มันทำงานอย่างไร

มันเพิ่มสี่เท่าในรายการอินพุตเพื่อให้แน่ใจว่าจำนวนข้อมูลหารด้วย 4

มันยังคงต้องการการเรียงลำดับเนื่องจาก*4ใช้กับรายการทั้งหมดแทนที่จะใช้กับแต่ละองค์ประกอบ

จากนั้นแยกรายการออกเป็นสี่ส่วนเท่า ๆ กันจากนั้นนำส่วนแรกและส่วนสุดท้ายออก

รายการที่เหลืออยู่จะแบนและใช้ค่าเฉลี่ย


8

MATL , 12 11 ไบต์

4Y"G"6L)]Ym

อินพุตเป็นเวกเตอร์แนวนอนพร้อมรูปแบบ

[1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38]

หรือ

[1 3 4 5 6 6 7 7 8 8 9 38]

ลองออนไลน์!

คำอธิบาย

4Y"    % Input horizontal vector implicitly. Repeat each element 4 times (run-length
       % decoding). The resulting array is still sorted.
G"     % Push input, for each: repeat as many times as the input size
  6L)  %   Remove first and last elements, by applying the index "2:end-1"
]      % End for each
Ym     % Compute mean. Display implicitly

ฉันไม่เข้าใจ จะ6L)ลบองค์ประกอบแรกและองค์ประกอบสุดท้ายได้อย่างไร เมื่อฉันทำมันผลักตัวเลขจำนวนเชิงซ้อนออกมา
DJMcMayhem

5
@DrGreenEggsandIronMan จำนวนเชิงซ้อนสามารถใช้สำหรับใน MATL หน่วยจินตภาพย่อมาจากตอนท้ายของอาเรย์และหากมีสองในสามหมายเลขพวกมันจะกำหนดช่วง ดังนั้น[2, -1+i]เมื่อใช้เป็นดัชนีหมายความว่า2:end-1
Luis Mendo

7

Snowman , 66 ไบต์

}vg","aS:10sB;aM4aRAsOal`,4nD,`aG0AaGal`NdE`AaL1AfL:nA;alaF,nDtSsP

ลองออนไลน์!

ใช้อัลกอริทึมเดียวกันกับคำตอบของ@LeakyNun

}         enable variables b, e, and g
vg        read a line of input into b
","aS     split on commas (in-place)
:10sB;aM  convert each element in resulting array to number ("frombase(10)-map")
4aR       repeat the array 4 times
AsO       sort the array
al        take the length and put it in e without consuming b (the array)
`,        swap b and e, then move e to g; now b=length g=array
4nD       divide b by 4 (4 was stored in e, which is why the array was moved)
,`        move the array and length/4 back to their original positions
aG        split the array into groups of length (length/4)
0AaG      take all elements with index >0 (i.e. remove the first element)
al        store the length of the new array in e again
`NdE`     bring it up to b, decrement, and put it back
AaL       take all elements with index <length-1 (i.e. remove last)
1AfL      flatten the array 1 level deep
:nA;      push a block that adds two numbers (to e)
al        store the length of this new array in g
aF        fold b over e (sum the numbers)
,         move g (the length) into e
nD        divide the sum by the length, resulting in the average
tSsP      to-string and print

2
ภาษานี้ดูแย่ ฉันรักมัน.
Mego


5

เยลลี่ , 14 13 12 ไบต์

x4ṫL '$ ḣLN $ S ÷ LH 
x4ṫLḊḣLN $ S ÷ LH
x4œs4ḊṖFS÷ LH

ลองออนไลน์!

ชุดทดสอบ

มันทำงานอย่างไร

มันเป็นคำแปลของฉันคำตอบใน Pyth


ฉันค่อนข้างแน่ใจว่านี่สั้นลงได้เพราะฉันสามารถทำได้ 15 ใน APL
2559

@ Adámโปรดโพสต์วิธีแก้ปัญหาของคุณ (เพื่อที่ฉันจะได้คัดลอกฮ่าฮ่า)
Leaky Nun

ฉันต้องการให้โอกาสกับ Marinus ...
59


มีโอกาสมากพอหลังจากผ่านไป 9 เดือนแน่นอน
Luis Mendo


4

Brachylogขนาด 21 ไบต์

:3jo@4brbcLl/N,L+:N*.

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบหลายรายการ

คำอธิบาย

นี่คืออัลกอริธึมของ Pyth ตอบ @ LeakyNun

:3j      Append 3 copies of the input to itself
o@4      Sort and split in 4 lists of equal length
brb      Remove the head and the tail of the list of lists
cL       Concatenate the 2 sublists into a list L
l/N,     N is the inverse of the length of L
L+:N*.   Output is the product of N and the sum of the elements of L

เคล็ดลับเล็ก ๆ เท่านั้นที่มีในการคูณด้วยการผกผันของความยาวแทนการหารด้วยความยาวเพราะการหารระหว่าง 2 จำนวนเต็มเป็นการหารจำนวนเต็ม


3

อ็อกเทฟ 44 ไบต์

@(x)mean(reshape(~~(1:4)'*x,[],4)(:,2:3)(:))

สิ่งนี้นิยามฟังก์ชันที่ไม่ระบุชื่อ

อินพุตเป็นเวกเตอร์แนวนอน

ลองบน ideone

คำอธิบาย

เวกเตอร์แนวนอนอินพุทเป็นเมทริกซ์คูณแรก ( *) โดยเวกเตอร์คอลัมน์สี่อัน (สร้างด้วย~~(1:4)') ผลลัพธ์คือเมทริกซ์สี่คอลัมน์โดยที่แต่ละแถวเป็นสำเนาของเวกเตอร์อินพุต สิ่งนี้จะถูกเปลี่ยนรูปใหม่ในขณะที่รักษาลำดับเชิงเส้นขององค์ประกอบลงในเมทริกซ์ 4 คอลัมน์ ( reshape(...,[],4)) คอลัมน์กลางสองคอลัมน์จะถูกเก็บไว้ ( (:,2:3)) และทำให้เป็นเส้นตรงเป็นคอลัมน์เดียว ( (:)) ซึ่งค่าเฉลี่ยถูกคำนวณ ( mean(...))


คุณสามารถบันทึกได้ 1 ไบต์ด้วยค่าที่อ่านได้[x;x;x;x]มากกว่า~~(1:4)'*x
Tom Carpenter

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))น้อยกว่า 2 ไบต์ นั่นเป็นสาเหตุที่ฉันคิดขึ้นมา แต่โดยพื้นฐานแล้วมันก็เหมือนกับวิธีการของคุณ
Tom Carpenter

@ TomCarpenter ฉันไม่คิดว่ามันคล้ายกัน ฉันคิดว่าคุณควรโพสต์เป็นคำตอบที่แยกต่างหาก
Luis Mendo

3

J , 20 18 ไบต์

2 ไบต์ขอบคุณ @miles

# -.:. @% ~ - @ # + / @}} # 4 #]
- @ # (+ /% #) @}} # 4 #]..

ลองออนไลน์! ( ล่ามออนไลน์ )

การใช้

>> f =: -@#(+/%#)@}.#}.4#]
>> f 1 3 5 7 9 11 13 15 17
<< 9

มันทำงานอย่างไร

มันเป็นคำแปลของฉันคำตอบใน Pyth


ออนไลน์ล่าม J
Adám

@ Adámขอบคุณที่เพิ่ม
Leun Nun

2
คุณก็สามารถโดยตรงใช้เวลาเฉลี่ยของส่วนตรงกลาง-@#(+/%#)@}.#}.4#]สำหรับ18 ไบต์
ไมล์

2

อันที่จริง , 20 15 13 ไบต์

; l╗; +; + S╜ @ t╜τ @ HΣ╜τ @ / 
; l; τ; a; +; + StHΣ /
; l; τ; aττStHΣ /

ลองออนไลน์!

มันทำงานอย่างไร

มันเป็นคำแปลของฉันคำตอบใน Pyth


สำหรับหนึ่งครั้งคำตอบที่แท้จริงซึ่งสามารถอ่านได้ (ในภาษากรีก)
Adám

@ Adám Pyth ใช้ ASCII
Leun Nun

2

ระดับแปดเสียง

อีกฟังก์ชั่นที่ไม่ระบุชื่อสำหรับคู่

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))

คุณสามารถลองออนไลน์ได้ เพียงป้อนคำสั่งนั้นจากนั้นทำans([1 2 4 5 6 9])ตามที่ต้องการ

อันนี้เริ่มต้นด้วยการสร้างจากแถวลำดับอินพุตหนึ่งกับ 4 ของแต่ละองค์ประกอบอินพุตโดยเชื่อมต่อสำเนาสี่ชุดในแนวตั้งก่อนจากนั้นจึงแผ่แนวตั้ง สิ่งนี้จะรักษาลำดับการเรียง

จากนั้นจะแยกช่วงขององค์ประกอบจากความยาวของอาร์เรย์อินพุตบวก 1 ถึงสามเท่าของความยาวของอาร์เรย์อินพุต เนื่องจากอาร์เรย์ใหม่ยาวกว่าสี่เท่าจึงตัดการควอไทล์บนและล่าง

ในที่สุดค่าเฉลี่ยของอาร์เรย์ใหม่จะถูกส่งกลับ



2

APL (Dyalog) 15 ไบต์

IQM←(+/÷≢)≢↓-∘≢↓4∘/

ลองออนไลน์!

4∘/ เพิ่มองค์ประกอบแต่ละส่วนเป็นสี่เท่า

-∘≢↓ ปล่อยองค์ประกอบที่ตามมามากเท่าที่มีองค์ประกอบในอาร์กิวเมนต์

≢↓ ดร็อปอิลิเมนต์นำจำนวนมากตามที่มีอิลิเมนต์ในการโต้แย้ง

(... ) ใช้ฟังก์ชัน tacit ต่อไปนี้:

+/ ผลรวม

÷ หารด้วย

 นับ


1

JavaScript (ES6), 75 ไบต์

a=>a.concat(a,a,a).sort(g=(x,y)=>x-y).slice(l=a.length,-l).reduce(g,0)/l/-2

ใช้วิธี quadruplicate-and-sort ที่เห็นได้ชัดและฉันได้ใช้reduceซึ่งก็ดี กลอุบายเดียวที่นี่คือการบันทึก 4 ไบต์โดยการนำตัวเปรียบเทียบการเรียงลำดับกลับมาใช้ใหม่เพื่อลบองค์ประกอบอาร์เรย์ทั้งหมดออกจากศูนย์ซึ่งจะให้-2lคำตอบที่ฉันต้องการ



1

จริงแล้ว 12 ไบต์

4α;l¼≈;±(Htæ

ลองออนไลน์! (ปัจจุบันไม่สามารถใช้งานได้เนื่องจาก TIO มีรุ่นไม่กี่รุ่น

คำอธิบาย:

4α;l¼≈;±(Htæ
4α            repeat each element 4 times
  ;l¼≈        length divided by 4, as integer
      ;±      copy, unary negate
        (Ht   remove first and last quartiles
           æ  mean

1

Mathematica, 51 ไบต์

Mean@#[[(l=1+Length@#/4);;-l]]&@Sort@Join[#,#,#,#]&

เรียงลำดับสี่สำเนาของรายการ (เพื่อป้องกันปัญหาที่มีความยาวหลายรายการสี่ไม่ได้) ใช้เวลาส่วนหนึ่ง"1 quarter the length of resulting list plus 1"ผ่านไปจะใช้เวลาของพวกเขา"1/4 length list + 1 from the end"Mean


1

Java 146 126 Bytes

java verbose มากเช่นนี้!

float m(float[]n){float r=0;int l=n.length,i=l/4;r-=(n[i])*(l%4)/4;r+=n[i*3]*(4-(l%4))/4;for(;i<l*3/4;r+=n[i],i++);return r/l*2;}

เก่ากว่า Ungolfed สามารถอ่านได้บางส่วนกับกรณีทดสอบ

/**
 *
 * @author rohan
 */
public Golf{

float m(float[]n){
//declarations 
float r=0;
int x,i=0,l=n.length;
//sum the array 
for(float m:n){r+=m;}
//remove the excess
for(;i<l/4;r-=n[i]+n[l-i-1],i++);
//weight the quartiles
r-=(n[l/4]+n[l*3/4])*(l%4)/4;
//return the sum/length but multiply by two since only half of the set is averaged
return r/l*2;
    }
static void interQuartileMean(float... set){
    System.out.println(new Golf().m(set));
}
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    //test cases pass with flying colours
        interQuartileMean(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38);
        interQuartileMean(1, 3, 5, 7, 9, 11, 13, 15, 17);   
    }

}

1

Clojure, 82 81 ไบต์

แก้ไข: น้อยกว่า 1 ไบต์โดยเขียนชิ้นส่วน "didvide by 2 n" อีกครั้ง

#(let[n(count %)](*(/ n)0.5(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))))

ก่อนหน้านี้:

#(let[n(count %)](/(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))(* 2.0 n)))

ใช้forเพื่อสร้างค่าซ้ำ 4 ค่าโดยใช้ float 2.0เพื่อไม่ให้มีเศษส่วนส่วนที่เหลือเป็นเพียงมาตรฐาน


1

R, 17 11 ไบต์

mean(n,0.25)

สมมติว่าเป็นเวกเตอร์การป้อนข้อมูลในรูปแบบn R มาตรฐานn=c(1, 2, 3, ...)

สิ่งนี้ไม่น่าแปลกใจเลยที่ R ถือว่าเป็น“ ภาษาสำหรับการคำนวณทางสถิติ” และมีสถิติในตัวมากมาย

UPDATE บันทึก 6 ไบต์ขอบคุณ rturnbull เพราะtrimเป็นอาร์กิวเมนต์ตัวเลือกแรกโดยค่าเริ่มต้น!

กรณีทดสอบ:

a <- c(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38)
b <- c(1, 3, 5, 7, 9, 11, 13, 15, 17)
mean(a,trim=0.25) # Returns 6.5
mean(b,trim=0.25) # Returns 9

เนื่องจากtrimเป็นอาร์กิวเมนต์เริ่มต้นที่สองคุณไม่จำเป็นต้องตั้งชื่อ 0.25สามารถลงไปหรือ.25 1/4วิธีนี้ช่วยให้คุณประหยัดหกไบต์
rturnbull

0

Excel, 17 ไบต์

=TRIMMEAN(A:A,.5)

รูปแบบอินพุตที่ผ่อนคลายทำให้เป็นเรื่องง่าย ป้อนหนึ่งต่อแถวในคอลัมน์ A

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.