การคำนวณเอนโทรปี


13

อินพุต

เมทริกซ์Mแสดงเป็นสองบรรทัดที่คั่นด้วยช่องว่างของจำนวนเต็ม แต่ละบรรทัดจะมีจำนวนเต็มเท่ากันและแต่ละจำนวนเต็มจะเป็น -1 หรือ 1 จำนวนเต็มต่อหนึ่งบรรทัดจะมากที่สุด 20 Mดังนั้นจึงเป็น2โดยnที่nเป็นจำนวนเต็มในแต่ละสองบรรทัด

รหัสของคุณควรเป็นโปรแกรมที่สมบูรณ์ และยอมรับอินพุตทั้งในมาตรฐานหรือจากไฟล์ (นั่นคือตัวเลือกของคุณ) คุณสามารถยอมรับอินพุตจากมาตรฐานในจากไฟล์หรือเพียงแค่เป็นพารามิเตอร์ อย่างไรก็ตามถ้าคุณทำอย่างหลังโปรดให้ตัวอย่างที่ชัดเจนว่าโค้ดของคุณควรทำงานอย่างไรและจำไว้ว่ามันจะต้องเป็นโปรแกรมที่สมบูรณ์และวิธีการแสดงเมทริกซ์Mในอินพุต กล่าวอีกนัยหนึ่งคุณน่าจะต้องทำการแยกวิเคราะห์

เอาท์พุต

ไบนารีเอนโทรปีนอนส์ของการกระจายของM*xที่องค์ประกอบของxกำลังอย่างสม่ำเสมอและเป็นอิสระได้รับการแต่งตั้งจาก {-1,1} xเป็นnเวกเตอร์คอลัมน์มิติ

เอนโทรปีของการแจกแจงความน่าจะเป็นแบบไม่ต่อเนื่องคือ

- sum p_i log_2(p_i)

ในกรณีนี้p_iน่าจะเป็นของวันที่ไม่ซ้ำกันที่เป็นไปได้iM*x

ตัวอย่างและคำแนะนำที่เป็นประโยชน์

เป็นตัวอย่างการทำงานให้เมทริกซ์Mเป็น

-1 1
-1 -1

ทีนี้ลองดู2^2เวกเตอร์ที่ต่างกันที่เป็นไปได้xทั้งหมด สำหรับแต่ละอันเราคำนวณM*xและใส่ผลลัพธ์ทั้งหมดลงในอาร์เรย์ (อาร์เรย์ 4 องค์ประกอบของเวกเตอร์องค์ประกอบ 2 ตัว) แม้ว่าสำหรับเวกเตอร์ 4 ตัวแต่ละอันความน่าจะเป็นที่เกิดขึ้นคือ1/2^2 = 1/4เราสนใจเพียงจำนวนครั้งที่แต่ละเวกเตอร์ผลลัพธ์ที่ไม่ซ้ำกันเกิดM*xขึ้นดังนั้นเราจึงสรุปความน่าจะเป็นส่วนบุคคลของการกำหนดค่าที่นำไปสู่เวกเตอร์เฉพาะที่เหมือนกัน กล่าวอีกนัยหนึ่งM*xเวกเตอร์ที่ไม่ซ้ำกันที่เป็นไปได้อธิบายถึงผลลัพธ์ของการแจกแจงที่เรากำลังตรวจสอบและเราต้องกำหนดความน่าจะเป็นของผลลัพธ์แต่ละอย่าง (ซึ่งโดยการก่อสร้างจะเป็นจำนวนเต็มคูณ1/2^2หรือ1/2^nโดยทั่วไปเสมอ) คำนวณเอนโทรปี

ในnกรณีทั่วไปขึ้นอยู่กับMผลลัพธ์ที่เป็นไปได้ของM*xช่วงตั้งแต่ "แตกต่างกันทั้งหมด" (ในกรณีนี้เรามีnค่าของiในp_iและแต่ละคนp_iมีค่าเท่ากับ1/2^n) ถึง "ทั้งหมดเดียวกัน" (ในกรณีนี้มีความเป็นไปได้เดียว ผลลัพธ์และp_1 = 1)

โดยเฉพาะสำหรับ2x2เมทริกซ์ข้างต้นMเราสามารถหาได้โดยการคูณมันด้วยการกำหนดค่าสี่แบบที่เป็นไปได้ ( [+-1; +-1]) ว่าเวกเตอร์ที่ได้แต่ละอันนั้นแตกต่างกัน p_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4ดังนั้นในกรณีนี้มีสี่ผลลัพธ์และผล จำได้ว่าlog_2(1/4) = -2เรามี:

- sum p_i log_2(p_i) = -(4*(-2)/4) = 2

ดังนั้นผลลัพธ์สุดท้ายของเมทริกซ์นี้คือ 2

กรณีทดสอบ

การป้อนข้อมูล:

-1 -1 
-1 -1

เอาท์พุท:

1.5

การป้อนข้อมูล:

-1 -1 -1 -1
-1 -1 -1 -1

เอาท์พุท:

2.03063906223

การป้อนข้อมูล:

-1  -1  -1  1
1  -1  -1  -1

เอาท์พุท:

3

7
1. ขนาดของxคืออะไร? 2. เพื่อประโยชน์ในการทำให้คำถามมีอยู่แล้วเอนโทรปีแบบไบนารีของแชนนอนMxถูกกำหนดไว้อย่างไร?
Peter Taylor

4
@ ข้อคิดเห็นของ Peter อธิบาย downvotes อย่างแน่นอน ฉันอ่านบทความเกี่ยวกับพลังงานแบบเอนโทรปีและไม่สามารถทราบได้ทันทีว่าจะต้องใช้อะไร คุณควรระบุให้ชัดเจนว่าสูตร / อัลกอริธึมคือการคำนวณเอนโทรปีของแชนนอน
ลินน์

5
คำถามควรอยู่ในตัวเอง; ไม่น่าเป็นไปได้ที่ Wikipedia จะออฟไลน์โดยฉับพลัน แต่จะเป็นการดีหากไม่ต้องคลิกผ่านไปยังหน้าอื่นเพื่อให้สามารถเข้าใจถึงข้อมูลจำเพาะทั้งหมดของความท้าทาย
ลูกบิดประตู

2
โดยค่าเริ่มต้นฟังก์ชั่นเป็นทางเลือกที่ถูกต้องกับโปรแกรม คุณได้รับอนุญาตให้ลบล้างข้อความนั้น แต่มันจะทำให้บางภาษาเศร้ามากเพราะใช้แผ่นสำเร็จรูปจำนวนมากเพื่อรับไฟล์หรืออินพุต stdin ในวงกว้างฉันขอแนะนำไม่ให้มีรูปแบบอินพุตที่เข้มงวดเช่นนี้ในความท้าทายทางคณิตศาสตร์ การอนุญาตให้ใช้ประเภทรายการที่เป็นธรรมชาติของภาษาจะทำให้ผู้คนมีความสุขมากขึ้นที่จะเข้าร่วม
xnor

3
@dorothy โปรดทราบว่าไม่ใช่ "log_2 (0) คือ 0 เพื่อความสะดวก" แต่เป็น "lim_ {p-> 0} p * log (p) == 0" ดังนั้น "log_2 (0)" ยังคงเป็น -inf
Andras Deak

คำตอบ:


3

Mathematica, 48 68 ไบต์

แก้ไข: การประมวลผลล่วงหน้าถูกเพิ่มเพื่อยอมรับสตริงเป็นพารามิเตอร์

ด้วยความช่วยเหลือของTuplesและEntropyการใช้งานมีทั้งรัดกุมและอ่านง่าย

Entropy[2,{-1,1}~Tuples~Length@#.#]&@Thread@ImportString[#,"Table"]&

ซึ่งTuples[{-1,1},n]ให้ntuples ที่เป็นไปได้ทั้งหมดจาก{-1,1}และEntropy[2,list]ให้เอนโทรปีของข้อมูลเบส 2

หนึ่งในสิ่งที่เจ๋งที่สุดคือMathematicaจะส่งคืนนิพจน์ที่ถูกต้องจริง ๆ :

%["-1 -1 \n -1 -1"]
(* 3/2 *)

สามารถประมาณผลลัพธ์ได้ด้วยการเพิ่มพิเศษ.( Entropy[2., ...)


Mathematica นั้นไร้สาระ :) อย่างไรก็ตามคำตอบของคุณไม่ตรงกับข้อมูลจำเพาะ อินพุตถูกคั่นด้วยช่องว่างดังนั้นจึงจำเป็นต้องมีการวิเคราะห์คำบางส่วน ดูอัพเดตล่าสุด
ธี

3

Perl, 160 159 141 ไบต์

รวม +1 สำหรับ-pตั้งแต่ 141 ไบต์การปรับปรุง

@y=(@z=/\S+/g)x 2**@z;@{$.}=map{evals/.1/"+".$&*pop@y/egr}glob"{-1,+1}"x@z}{$H{$_.$2[$i++]}++for@1;$\-=$_*log($_/=1<<@z)/log 2 for values%H;

การป้อนข้อมูลที่เป็นที่คาดหวังในการSTDINเป็น 2 สายประกอบด้วยพื้นที่แยกหรือ 1 ทำงานเป็น-1
perl -p 140.pl < inputfile

มันจะไม่ชนะรางวัลใด ๆ แต่ฉันคิดว่าฉันจะแบ่งปันความพยายามของฉัน
อธิบาย:

    @y=                             # @y is (@z) x (1<<$n)
       (@z = /\S+/g)                # construct a matrix row from non-WS
       x 2**@z;                     # repeat @z 2^$n times
    @{$.} = map {                   # $.=$INPUT_LINE_NUMBER: set @1 or @2
      eval s/.1/"+".$&*pop@y/egr    # multiply matrix row with vector
    } glob "{-1,+1}" x @z           # produce all possible vectors

}{                                  # `-p` trick: end `while(<>)`, reset `$_`

$H{ $_ . $2[$i++] }++               # count unique M*x columns
    for @1;

$\ -= $_ * log($_/=1<<@z) / log 2   # sum entropy distribution
        for values %H;

ข้อมูล

  • ปรับปรุง 159: บันทึก 1 โดยการกำจัด()โดยใช้แทน**<<
  • ปรับปรุง 141: บันทึก 18 โดยใช้และ$.-p

1
ขอขอบคุณ! เรามีคำตอบไม่เพียงพอสำหรับ ppcg imho
dorothy

@dorothy เป็นเพราะนักกอล์ฟโค้ดเกลียด Perl มากที่สุด
Addison Crump

@FlagAsSpam แต่ แต่ .. perl นั้นเข้าใจยากรวบรัดและเส้นเขตแดนบ้า มันจะเหมาะสมกว่าสำหรับ code-golf อย่างไร
ธี

@dorothy ¯ \ _ (ツ) _ / ¯เราหลีกเลี่ยงเหมือนโรคระบาด Dunno ทำไมจริงๆ
Addison Crump

2

Pyth, 37 ไบต์

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8

ชุดทดสอบ

นี่ค่อนข้างยุ่งยากเมื่อคุณต้องใช้การคูณเมทริกซ์ด้วยตนเอง

คำอธิบาย:

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8
       JrR7.z                            Parse input into matrix, assign to J.
  _B1                                    [1, -1]
K^   lhJ                                 All +-1 vectors of length n, assign to K.
                           m       K     Map over K
                            m     J      Map over the rows of J
                             s*Vdk       Sum of vector product of vector and row.
                          S              Sort
                         r          8    Run length encode.
                       hM                Take just occurrence counts.
                   cRlK                  Divide by len(K) to get probabilities.
               *Lld                      Multiply each probabiliity by its log.
              s                          Sum.
             _                           Negate. Print implicitly.

ว้าว! :) ดูเหมือนว่างานมากมาย ตอนนี้คน cjam อยู่ที่ไหน ..... ?
dorothy

1

MATLAB, 196 194 187 184 126 154 ไบต์

(พิเศษ 28 ไบต์จาก 126 ถึง 154 เกิดจากการแยกวิเคราะห์อินพุต: ตอนนี้โค้ดยอมรับอินพุตเป็นตัวเลขสองบรรทัดที่คั่นด้วยช่องว่าง)

f=@()str2num(input('','s'));M=[f();f()];n=size(M,2);x=(dec2bin(0:n^2-1,n)-48.5)*2*M';[~,~,c]=unique(x,'rows');p=accumarray(c,1)/2^n;disp(-sum(p.*log2(p)))

เวอร์ชันที่ไม่ถูกปรับแต่ง:

f=@()str2num(input('','s'));        % shorthand for "read a line as vector"
M=[f();f()];                        % read matrix
n=size(M,2);                        % get lenght of vectors

x=(dec2bin(0:n^2-1,n)-48.5)*2*M';   % generate every configuration
                                    %    using binary encoding
[~,~,c]=unique(x,'rows');           % get unique rows of (Mx)^T
p=accumarray(c,1)/2^n;              % count multiplicities and normalize
disp(-sum(p.*log2(p)))              % use definition of entropy

ฉันสามารถทำได้ด้วย 6 ไบต์หากans = ...ได้รับอนุญาตประเภทเอาท์พุท "" ฉันไม่แน่ใจเกี่ยวกับสิ่งนี้

ฉันขอโทษที่จะกล่าวว่าเดิมและฉันก็แก้ปัญหาไหวพริบถูกเกินไป ungolfed เมื่อเทียบกับวิธีการแก้ปัญหาปัจจุบันของฉัน accumarrayและนี่ก็เป็นครั้งแรกที่ฉันใช้ แอปพลิเคชันหกอินพุตพารามิเตอร์ยังต้องรออยู่ :)

เอาท์พุท (ดังต่อไปนี้format long):

[-1 1
-1 -1]
     2

[-1 -1
-1 -1]
   1.500000000000000

[-1 -1 -1 -1
-1 -1 -1 -1]
   2.030639062229566

[-1  -1  -1  1
1  -1  -1  -1]
     3

เอาท์พุทที่มีค่าเริ่มต้นformat short g:

[-1 1
-1 -1]
     2

[-1 -1
-1 -1]
          1.5

[-1 -1 -1 -1
-1 -1 -1 -1]
       2.0306

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