একটি স্ট্রিংয়ের হিস্টগ্রাম এনট্রপি অনুমান গণনা করুন


19

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা প্রদত্ত স্ট্রিংয়ের শ্যানন এনট্রপি অনুমান করে।

একটি স্ট্রিং থাকে এন অক্ষর, স্বতন্ত্র অক্ষর, x আমি হয় আমি তম স্বতন্ত্র অক্ষর, এবং পি (এক্স আমি ) স্ট্রিং যে চরিত্র উদিত হত্তয়া সম্ভাব্যতা, তাহলে সেই স্ট্রিং এর জন্য আমাদের শ্যানন এনট্রপি অনুমান দেওয়া হয়:

এইচ = -n \ যোগফল \ সীমা_ {i = 1} ^ d পি (x_i) \ লগ_2 পি (x_i)

এই চ্যালেঞ্জের অনুমানের জন্য আমরা ধরে নিই যে একটি স্ট্রিংয়ের সাথে অক্ষরের সংঘটিত হওয়ার সম্ভাবনা কেবলমাত্র অক্ষরের মোট সংখ্যার দ্বারা বিভক্ত হওয়ার পরিমাণ simply

আপনার উত্তরটি পিরিয়ডের পরে কমপক্ষে 3 ডিজিটের সঠিক হতে হবে।


পরীক্ষার কেস:

"This is a test.", 45.094
"00001111", 8.000
"cwmfjordbankglyphsvextquiz", 122.211
"             ", 0.0

আমার স্বাভাবিক চ্যালেঞ্জগুলির বিরুদ্ধে, এটিকে জটিল দেখায়, তবে এটি আসলে বেশ সহজ :)
orlp


ইনপুট স্ট্রিংয়ের জন্য মুদ্রণযোগ্য ASCII ধরে নেওয়া কি নিরাপদ?
অ্যাডমবর্কবার্ক

@ টিমিমিডি নং আপনার ভাষার স্ট্রিং টাইপের যে কোনও স্ট্রিং সমর্থন করে।
orlp

দুর্ভাগ্যক্রমে, ম্যাথামেটিকার Entropyচরিত্র অনুসারে বিটগুলি গণনা করা হয়, স্ট্রিংয়ের জন্য মোট নয়; ওহ ভাল ...
2012campion

উত্তর:


2

জেলি, 11 8 বাইট

ċЀ÷Ll.S

এটি অনলাইন চেষ্টা করুন!


আমি জিজ্ঞাসা করতে পারি, আপনি কীভাবে এই চরিত্রগুলি প্রবেশ করেন? কপি এবং পেস্ট দিয়ে?
বিলিন্ট

কমপক্ষে লিনাক্সে এগুলি সমস্তই মার্কিন আন্তর্জাতিক কীবোর্ডে টাইপ করা যায়।
ডেনিস

11

পাইথন 3.3+, 64 বাইট

import math
lambda s:sum(math.log2(len(s)/s.count(c))for c in s)

Mbomb007 এর সমাধানmath.log2 থেকে পেয়েছেন ।


সুতরাং @ অরলপ আমাদেরকে একটি সম্পূর্ণ সরলীকৃত সূত্র দেয় নি, হ ...?
mbomb007

@ mbomb007 আপনি কী উদ্দেশ্যে সরল করছেন তা নির্ভর করে। সম্ভাব্যতা এবং স্বতন্ত্র চরিত্রগুলির ক্ষেত্রে এটি লেখার সংজ্ঞা হিসাবে স্বাভাবিক, তবে গল্ফিংয়ের জন্য এটি গণনাগুলির সাথে কাজ করা এবং সমস্ত অক্ষরের উপরে পুনরাবৃত্তি করা আরও কম।
xnor

1
আপনার সূত্রের সাথে পাইথের উত্তর: পাইথ.হেরোকুয়াপ.com/… 8 বাইট
মালটিসেন

2

এপিএল, 18 14 বাইট

+/2⍟≢÷(+/∘.=⍨)

এটি একটি নামবিহীন, মোনাডিক ফাংশন ট্রেন যা ডানদিকে একটি স্ট্রিং গ্রহণ করে এবং একটি বাস্তব ফেরত দেয়।

জীবনের সমস্ত ভাল জিনিসের মতো এটি এক্সনরের সূত্র ব্যবহার করে । স্ট্রিংয়ের প্রতিটি অক্ষরের ∘.=⍨সংখ্যার সাথে মিল রেখে আমরা বুলিয়ানগুলির একটি ম্যাট্রিক্স পাই, প্রতিটি অক্ষরের সংখ্যার +/সংখ্যা পেতে প্রথম অক্ষ ( ) এর সাথে এটি যোগ করুন, প্রতিটি দ্বারা স্ট্রিংয়ের দৈর্ঘ্য ভাগ করুন, তারপরে লগ বেস 2 নিন ( 2⍟) এবং যোগফল।

এখানে চেষ্টা করুন

ডেনিসের জন্য 4 টি বাইট সংরক্ষণ করা!



1

জাভাস্ক্রিপ্ট (ES6), 67 বাইট

s=>[...s].map(c=>t+=Math.log2(s.length/~-s.split(c).length),t=0)&&t

আমার ব্যবহার করা দরকার ~-s.splitকারণ এটি রেজিেক্সপসের চেয়ে স্ট্রিং গ্রহণ করে। যথারীতি বাইট দিয়ে mapমারধর reduceকরে।

s=>[...s].reduce((t,c)=>t+Math.log2(s.length/~-s.split(c).length),0)

1

পার্ল 5, 58 বাইট

একটি সাবরুটিন:

{for$a(@a=split'',pop){$t+=(log@a/grep/\Q$a/,@a)/log 2}$t}

সূত্রটির জন্য xnor করতে আমার টুপিটির একটি টিপ ।


-F(স্ট্রবেরিতে, যাইহোক) কাজ করে না কারণ এটিতে অন্তর্ভুক্ত রয়েছে $/
এমএস 210

1

এমএটিএল , 14 বাইট

!Gu=stGn/Zl*s|

এটি অনলাইন চেষ্টা করুন!

!      % transpose implicit input into column vector
Gu     % row vector with unique elements of input
=      % test for equality, element-wise with broadcast
s      % sum of each column
tGn/   % duplicate. Divide by number of input characters
Zl     % binary logarithm
*      % element-wise multiplication
s      % sum of array
|      % absolute value. Display implicitly


1

জে - 18 16 14 বাইট

1#.2^.#%1#.=/~

ডেনিসের পদ্ধতিতে ধারণাটি ব্যবহার করে সংক্ষিপ্ত করা হয়েছে।

ব্যবহার

   f =: 1#.2^.#%1#.=/~
   f 'This is a test.'
45.0936
   f '00001111'
8
   f 'cwmfjordbankglyphsvextquiz'
122.211
   f '             '
0

ব্যাখ্যা

1#.2^.#%1#.=/~  Input: string S
           =/~  Create a table testing for equality
        1#.     Convert each row from a list of base 1 digits to decimal
                This is equivalent to taking the sum and forms a list of tallies
      #         Get the length of S
       %        Divide the length by each tally
   2^.          Log base 2 of each
1#.             "Sum" those values and return

1
আমি মনে করি না এটি একটি ফাংশন হিসাবে গণনা করা হয়। যদি আপনি কোডটি কোনও ভেরিয়েবলকে বরাদ্দ করেন তবে এটি সম্পূর্ণ ভিন্ন কিছু করে।
ডেনিস

@ ডেনিস আমি যা সংগ্রহ করি তা থেকে, জে এটিকে রচনাগুলির একটি শৃঙ্খলা হিসাবে ব্যাখ্যা করে, 3 : '... y'একই বাক্য বিন্যাসের সাহায্যে এটি একটি কার্য হিসাবে সংজ্ঞায়নের বৈধ উপায় হতে পারে। জে বলেছেন যে এটি ডান থেকে বাম থেকে মূল্যায়ন করে, তাই আমি আমার কোডটিকে ট্রেন হিসাবে রিফেক্ট করেছি। আমি ক্যাপগুলি পছন্দ করি না [:তবে ট্রেন করার কোনও অন্য উপায় খুঁজে পাচ্ছি না।
মাইল


0

জल्फ, 26 বাইট

_*liuΜGμiEd*γ/l miLeHlimzγ

এখানে চেষ্টা করুন! (নোট করুন যে পরীক্ষার স্যুট ফাংশনটি উদাসীন)

ব্যাখ্যা

_*liuΜGμiEd*γ/l miLeHlimzγ
       μi                   unique members of i
      G  E                  split on ""
     Μ    d                 map over function
               _miLeH       match i with regex escaped member
             /l      li     divide length of (^) by length of i
            γ               γ = (^)
           *           mzγ  (^) * log_2(γ)
 *li                        (^) * length of i
_                           negate

0

পাইথন 3.3+, 95 91 89 85 বাইট

সহজ সমাধান। সংস্করণ 3.3 ব্যবহার করা প্রয়োজন math.log2

import math
def f(s):C=s.count;return-sum(C(x)*math.log2(C(x)/len(s))for x in set(s))

এটি অনলাইনে চেষ্টা করুন


আপনি কি এখানে অযথা কিছু মনে করেন? n*sum(s.count(c)/n
orlp

ধন্যবাদ সম্ভাব্যতা সন্ধানের জন্য আমার মূলত একটি পৃথক ফাংশন ছিল, তবে এটি দু'বার ভিতরে আটকানো হয়েছিল এবং অক্ষর সংরক্ষণ করতে এটি মুছে ফেলেছিলাম।
mbomb007

আপনি nকেবলমাত্র একবার এটি ব্যবহার করেন আপনাকে এখন কোনও ভেরিয়েবলে সঞ্চয় করতে হবে না ।
মালতিসেন

0

জাভা 7, 207 বাইট

double C(String x,Map<Character,Integer>f){double H=0,g;for(char c:x.toCharArray())f.put(c,f.containsKey(c)?f.get(c)+1:1);for(char c:f.keySet()){g=f.get(c);H+=g*Math.log(g/x.length())/Math.log(2);}return-H;}

অনলাইনে বিস্তারিত চেষ্টা করুন

double log2(double d) { return Math.log(d) / Math.log(2); }

double C(String x, Map<Character,Integer>f)
{
    double H=0,g;

    // frequency
    for(char c : x.toCharArray())
    {
        f.put(c, f.containsKey(c) ? f.get(c)+1 : 1);
    }

    // calculate entropy
    for(char c : f.keySet())
    {
        g = f.get(c);
        H += g * log2(g / x.length());
    }

    return -H;
}

0

ফ্যাক্টর, 98 বাইট

[ [ length ] [ dup [ [ = ] curry dupd count ] { } map-as nip ] bi [ / log 2 log / ] with map sum ]

এটি এই পাইথন উত্তরের প্রত্যক্ষ অনুবাদ । আমি রাতের খাবারের উপরে একটি ব্যাখ্যা যুক্ত করব।


0

র‌্যাকেট, 130 বাইট

: গ

#lang racket
(require math)(λ(S)(let([s(string->list S)])(sum(map(λ(c)(/(log(/(length s)(count(λ(x)(char=? c x))s)))(log 2)))s))))

আমার ফ্যাক্টর উত্তরের অনুবাদ, সুতরাং এটি কেনি ল'র পাইথন উত্তরের একটি পরোক্ষ অনুবাদ।


0

কে (32 বাইট)

{-+/c*(log c%n:+/c:#:'=x)%log 2}

বা এর মধ্যে qঅনুবাদটি খুব ছোট নয় তবে আরও পরিষ্কার:

{neg sum c*2 xlog c%n:sum c:count each group x}

0

গণিত, 45 বাইট

Tr[Log[2,Tr@#/#]#]&@Values@CharacterCounts@#&

ব্যবহার

এটি সঠিক ফলাফলগুলি দেয় যাতে আমরা তাদের সাথে আনুমানিক N

  f = Tr[Log[2,Tr@#/#]#]&@Values@CharacterCounts@#&
  f["This is a test."]//N
45.0936
  f["00001111"]//N
8.
  f["cwmfjordbankglyphsvextquiz"]//N
122.211
  f["             "]//N
0.

0

আর, 67 বাইট

l=length(i<-strsplit(readline(),"")[[1]]);-sum(log2(l/table(i)[i]))

ব্যাখ্যা

স্টিডিনের কাছ থেকে ইনপুট নিন এবং এটিকে অক্ষরের তালিকায় বিভক্ত করুন। (এই ছদ্মবেশী বাক্য গঠনটি কেন আর স্ট্রিং গল্ফ চ্যালেঞ্জগুলি এত শক্ত ...)

         i<-strsplit(readline(),"")[[1]])

এই অ্যাসাইনমেন্টটি কোনও lengthকমান্ডের অভ্যন্তরে লুকানো রয়েছে , সুতরাং আমরা একটির দামের জন্য দুটি অ্যাসাইনমেন্ট পাই। আমাদের কাছে iঅক্ষরের তালিকা এবং lএর দৈর্ঘ্য রয়েছে।

l=length(i<-strsplit(readline(),"")[[1]]);

এখন আমরা এনট্রপি গণনা করি। আর এর একটি দুর্দান্ত ফাংশন রয়েছে tableযা সমস্ত অনন্য মানের গণনা প্রদান করে। ইনপুট জন্য This is a test,table(i) রিটার্ন

> table(i)
i
  . a e h i s t T 
3 1 1 1 1 2 3 2 1

এটি অক্ষর দ্বারা সূচিত হয়, যা দুর্দান্ত, কারণ আমরা iপ্রতিটি অক্ষরের গণনা পেতে সূচক হিসাবে ব্যবহার করতে পারি, যেমন :

> table(i)[i]
i
T h i s   i s   a   t e s t . 
1 1 2 3 3 2 3 3 1 3 2 1 3 2 1 

কোডটির বাকী অংশটি হ'ল এন্ট্রপি সূত্রে একটি সাধারণ বাস্তবায়ন, কিছুটা ঘুরে।

                                           -sum(log2(l/table(i)[i]))



0

সি #, 159 বাইট

Golfed:

string f(string s){var l=s.Length;double sum=0;foreach(var item in s.GroupBy(o=>o)){double p=(double)item.Count()/l;sum+=p*Math.Log(p,2);}return(sum*=-l)+"";}}

Ungolfed:

string f(string s)
{
  var l = s.Length;
  double sum = 0;
  foreach (var item in s.GroupBy(o => o))
  {
    double p = (double)item.Count() / l;
    sum += p * Math.Log(p, 2);
  }
  return (sum *= -l) + "";
}

টেস্ট:

var codeGolf = new StringHistogramEntropyEstimation();
    Console.WriteLine(codeGolf.f("This is a test.")); //45.0935839298008
    Console.WriteLine(codeGolf.f("00001111")); //8
    Console.WriteLine(codeGolf.f("cwmfjordbankglyphsvextquiz")); //122.211432671668
    Console.WriteLine(codeGolf.f("             ")); //0

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.