সিম্পসন বৈচিত্র্য সূচক


19

সিম্পসন সূচক সদৃশ সঙ্গে আইটেম সংগ্রহ বৈচিত্র্য একটি পরিমাপ। এলোমেলোভাবে একসাথে প্রতিস্থাপন ছাড়াই বাছাই করার সময় এটি দুটি ভিন্ন আইটেম আঁকার সম্ভাবনা।

সঙ্গে nদলের আইটেম n_1, ..., n_kঅভিন্ন আইটেম, দুটি ভিন্ন আইটেম সম্ভাব্যতা

$$ 1- \ যোগ_ {i = 1} ^ k \ frac {n_i (n_i-1)} {n (n -1)}

উদাহরণস্বরূপ, আপনার কাছে 3 টি আপেল, 2 কলা এবং 1 গাজর থাকলে বৈচিত্র্য সূচকটি

D = 1 - (6 + 2 + 0)/30 = 0.7333

অন্যথা, বিভিন্ন আইটেম unordered জোড়া সংখ্যা 3*2 + 3*1 + 2*1 = 1115 জোড়া সামগ্রিক থেকে ও 11/15 = 0.7333

ইনপুট:

অক্ষর একটি স্ট্রিং Aথেকে Z। বা, এই জাতীয় অক্ষরের একটি তালিকা। এর দৈর্ঘ্য কমপক্ষে ২ হবে You আপনি এটি বাছাই করে ধরে নিতে পারেন না।

আউটপুট:

সেই স্ট্রিং-এর অক্ষরগুলির সিম্পসন বৈচিত্র্য সূচক, অর্থাৎ, দুটি অক্ষর প্রতিস্থাপনের সাথে এলোমেলোভাবে নেওয়া সম্ভাবনা আলাদা different এটি 0 এবং 1 সমেত একটি সংখ্যা।

যখন একটি ভাসা, ডিসপ্লে অন্তত 4 সংখ্যা outputting মত সঠিক আউটপুট সসীম যদিও 1বা 1.0বা 0.375ঠিক আছ।

আপনি বিল্ট-ইনগুলি ব্যবহার করতে পারবেন না যা বিশেষত বৈচিত্র্য সূচকগুলি গণনা করে বা এনট্রপি ব্যবস্থা গ্রহণ করে। আসল এলোমেলো নমুনা ঠিক আছে, যতক্ষণ আপনি পরীক্ষার ক্ষেত্রে যথাযথ নির্ভুলতা পান।

পরীক্ষার মামলা

AAABBC 0.73333
ACBABA 0.73333
WWW 0.0
CODE 1.0
PROGRAMMING 0.94545

লিডারবোর্ড

এখানে মার্টিন বাটনার সৌজন্যে একটি উপ-ভাষা লিডারবোর্ড রয়েছে ।

আপনার উত্তরটি প্রদর্শিত হয়েছে তা নিশ্চিত করার জন্য, দয়া করে নীচের মার্কডাউন টেম্পলেটটি ব্যবহার করে আপনার উত্তরটি শিরোনাম দিয়ে শুরু করুন:

# Language Name, N bytes

Nআপনার জমা দেওয়ার আকারটি কোথায় ? আপনি যদি নিজের স্কোরটি উন্নত করেন তবে আপনি পুরানো স্কোরগুলি শিরোনামে রেখে দিতে পারেন । এই ক্ষেত্রে:

# Ruby, <s>104</s> <s>101</s> 96 bytes


আপনি গিনি-সিম্পসন সূচকটি ব্যবহার করছেন, যখন ব্যবহারের জন্য আরও ভাল পরিমাপটি হ'ল বিপরীত সিম্পসন সূচক এবং কার্যকর প্রকারের সংখ্যা।
জো জেড

1
মূলত 1/পরিবর্তে 1-। [অপেশাদার পরিসংখ্যানবিদ ভাঁজ টুপি বন্ধ করেছেন]
জো জেড

উত্তর:


5

পাইথন 2, 72

ইনপুটটি স্ট্রিং বা একটি তালিকা হতে পারে।

def f(s):l=len(s);return sum(s[i%l]<>s[i/l]for i in range(l*l))/(l-1.)/l

আমি ইতিমধ্যে জানি যে এটি পাইথন 3 এ 2 বাইট কম হবে তাই দয়া করে আমাকে উপদেশ দিন না :)


<>36 টি অবস্থানে কোণ বন্ধনীগুলি কী করছে? আমি এর সিনট্যাক্স এর আগে কখনও দেখিনি।
ApproachingDarknessFish

@ টুটিফ্রুতিজাকুজি: এটি এর প্রতিশব্দ !=
রিমকো জারলিচ

1
@ টুটিফুটতি জাকুজি এটি অজগর 2 কেবলমাত্র যদি আপনি না হনfrom __future__ import barry_as_FLUFL
মাতসয়জয়

@ ভিওজ- l=len(s);সেখানে উপস্থিতদের সাথে নয়
Sp3000

@ Sp3000 ডান, এটি কতবার ব্যবহৃত হয়েছে তা লক্ষ্য করেননি।
কেড

4

পাইথ - 19 13 12 11 বাইট

আমাকে এন সম্পর্কে বলার জন্য @ আইস্যাকগকে ধন্যবাদ

.cসংমিশ্রণ ফাংশন সহ ব্রুট ফোর্স পদ্ধতির ব্যবহার করে।

csnMK.cz2lK

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

টেস্ট স্যুট

c                Float division
 s               Sum (works with True and False)
  nM             Map uniqueness
   K             Assign value to K and use value
    .c 2         Combinations of length 2
      z          Of input
 lK              Length of K

আপনি এর .{সাথে প্রতিস্থাপন করতে পারেন n- তারা এখানে সমতুল্য।
isaacg

@ আইসএইচজি ওহ এটি স্বয়ংক্রিয়ভাবে স্প্ল্যাটস জানত না, দুর্দান্ত।
মাল্টেসেন

4

এসকিউএল (পোস্টগ্রিএসকিউএল), 182 বাইট

পোস্টগ্রিসে একটি ফাংশন হিসাবে।

CREATE FUNCTION F(TEXT)RETURNS NUMERIC AS'SELECT 1-sum(d*(d-1))/(sum(d)*(sum(d)-1))FROM(SELECT COUNT(*)d FROM(SELECT*FROM regexp_split_to_table($1,''''))I(S)GROUP BY S)A'LANGUAGE SQL

ব্যাখ্যা

CREATE FUNCTION F(TEXT) -- Create function f taking text parameter
RETURNS NUMERIC         -- declare return type
AS'                     -- return definition
    SELECT 1-sum(d*(d-1))/(sum(d)*(sum(d)-1)) -- Calculate simpson index
    FROM(
        SELECT COUNT(*)d  -- Count occurrences of each character
        FROM(             -- Split the string into characters
            SELECT*FROM regexp_split_to_table($1,'''')
            )I(S)
        GROUP BY S        -- group on the characters
        )A 
'
LANGUAGE SQL

ব্যবহার এবং পরীক্ষা চালানো

SELECT S, F(S)
FROM (
    VALUES
    ('AAABBC'),
    ('ACBABA'),
    ('WWW'),
    ('CODE'),
    ('PROGRAMMING')
   )I(S)

S              F
-------------- -----------------------
AAABBC         0.73333333333333333333
ACBABA         0.73333333333333333333
WWW            0.00000000000000000000
CODE           1.00000000000000000000
PROGRAMMING    0.94545454545454545455

4

জে, 26 বাইট

1-+/((#&:>@</.~)%&(<:*])#)

শীতল অংশ

আমি </.নিজের বিরুদ্ধে স্ট্রিং চাবি ( ~প্রতিচ্ছবি জন্য) তারপরে প্রতিটি বাক্সের অক্ষর গণনা করে প্রতিটি চরিত্রের সংখ্যা খুঁজে পেয়েছি ।


1
(#&:>@</.~)হতে পারে (#/.~)এবং (<:*])হতে পারে (*<:)। আপনি যদি কোনও সঠিক ফাংশন ব্যবহার করেন তবে এটি দেয় (1-(#/.~)+/@:%&(*<:)#)। আশেপাশের ধনুর্বন্ধনী সাধারণত এখানে গণনা করা হয় না (ছেড়ে যাওয়া 1-(#/.~)+/@:%&(*<:)#, ফাংশন এর শরীর) এটি 20 বাইট দেয়।
এলোমেলো

4

পাইথন 3, 66 58 বাইট

এটি প্রশ্নে প্রদত্ত সাধারণ গণনা সূত্রটি ব্যবহার করছে, খুব জটিল কিছু নয়। এটি একটি বেনামে ল্যাম্বদা ফাংশন, সুতরাং এটি ব্যবহার করার জন্য, আপনাকে এটির একটি নাম দেওয়া দরকার।

8 টি বাইট সংরক্ষণ করা!

lambda s:1-sum(x-1for x in map(s.count,s))/len(s)/~-len(s)

ব্যবহার:

>>> f=lambda s:1-sum(x-1for x in map(s.count,s))/len(s)/~-len(s)
>>> f("PROGRAMMING")
0.945454

অথবা

>>> (lambda s:1-sum(x-1for x in map(s.count,s))/len(s)/~-len(s))("PROGRAMMING")
0.945454

3

এপিএল, 39 36 বাইট

{n←{≢⍵}⌸⍵⋄N←≢⍵⋄1-(N-⍨N×N)÷⍨+/n-⍨n×n}

এটি একটি নামবিহীন মোনাড তৈরি করে।

{
  n ← {≢⍵}⌸⍵               ⍝ Number of occurrences of each letter
  N ← ≢⍵                   ⍝ Number of characters in the input
  1-(N-⍨N×N)÷⍨+/n-⍨n×n     ⍝ Return 1 - sum((n*n-n)/(N*N-N))
}

আপনি এটি অনলাইন চেষ্টা করতে পারেন !


2

পাইথ, 13 বাইট

csnM*zz*lztlz

@ ফেয়ারসামের সমাধানটির আক্ষরিক অনুবাদ খুব সুন্দর।


2

সিজেম, 25 বাইট

l$_e`0f=_:(.*:+\,_(*d/1\-

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

প্রশ্নের সূত্রটি মোটামুটি প্রত্যক্ষ বাস্তবায়ন

ব্যাখ্যা:

l     Get input.
$     Sort it.
_     Copy for evaluation of denominator towards the end.
e`    Run-length encoding of string.
0f=   Map letter/length pairs from RLE to only length.
      We now have a list of letter counts.
_     Copy list.
:(    Map with decrement operator. Copy now contains letter counts minus 1.
.*    Vectorized multiply. Results in list of n*(n-1) for each letter.
:+    Sum vector. This is the numerator.
\     Bring copy of input string to top.
,     Calculate length.
_(    Copy and decrement.
*     Multiply. This is the denominator, n*(n-1) for the entire string.
d     Convert to double, otherwise we would get integer division.
/     Divide.
1\-   Calculate one minus result of division to get final result.

1

জে, 37 বাইট

(1-([:+/]*<:)%+/*[:<:+/)([:+/"1~.=/])

তবে আমি বিশ্বাস করি এটি এখনও ছোট করা যেতে পারে।

উদাহরণ

(1-([:+/]*<:)%+/*[:<:+/)([:+/"1~.=/]) 'AAABBC'

এটি নিম্নলিখিত ফাংশনটির কেবলমাত্র একটি স্বতন্ত্র সংস্করণ:

   fun =: 3 : 0
a1=.+/"1 (~.y)=/y
N=.(+/a1)*(<:+/a1)
n=.a1*a1-1
1-(+/n)%N
)

কিছু অতিরিক্ত গল্ফিং এবং এটি একটি সঠিক ফাংশন করার পরে: (1-(%&([:+/]*<:)+/)@(+/"1@=))29 বাইট দেয়। 27 যদি আমরা (1-(%&([:+/]*<:)+/)@(+/"1@=))এখানে ফাংশনটি ঘিরে বন্ধনীগুলি গণ্য না করি তবে এটি এখানে সাধারণ it নোটস: =yহুবহু (~.=/])yএবং কম্পোজ কনজাকশন ( x u&v y= (v x) u (v y)) খুব সহায়ক ছিল।
এলোমেলো

পরামর্শের জন্য ধন্যবাদ! আমি এখনও স্বতঃপ্রকাশ প্রকাশ করতে শিখছি। আপাতত, আমি অংশবিশেষে সংযুক্ত করে সংশ্লেষ সংজ্ঞা তৈরি করতে 13: 0 ব্যবহার করি।
Gar

1

সি, 89

fস্কোরটি কেবলমাত্র ফাংশনের জন্য এবং অপ্রয়োজনীয় সাদা স্থান বাদ দেয় যা কেবল স্বচ্ছতার জন্য অন্তর্ভুক্ত। mainফাংশন শুধুমাত্র পরীক্ষার জন্য।

i,c,n;
float f(char*v){
  n=strlen(v);
  for(i=n*n;i--;)c+=v[i%n]!=v[i/n]; 
  return 1.0*c/(n*n-n);
}

main(int C,char**V){
  printf("%f",f(V[1]));
}

এটি প্রতিটি চরিত্রকে অন্য প্রতিটি চরিত্রের সাথে কেবল তুলনা করে, তারপরে মোট তুলনা সংখ্যার দ্বারা ভাগ করে।


1

পাইথন 3, 56

lambda s:sum(a!=b for a in s for b in s)/len(s)/~-len(s)

অসম উপাদানগুলির জোড়গুলি গণনা করে, তারপর এই জাতীয় জোড়গুলির সংখ্যা দ্বারা ভাগ করে।


1

হাস্কেল, 83 বাইট

আমি জানি আমি দেরি করেছি, এটি পেয়েছি, পোস্ট করতে ভুলে গিয়েছিলাম। কিন্ডা হ্যাস্কেলের সাথে সুস্পষ্ট নয় যাতে আমাকে একে অপরের দ্বারা ভাগ করতে পারে এমন সংখ্যায় পূর্ণসংখ্যার রূপান্তর করতে হয়।

s z=(l(filter id p)-l z)/(l p-l z) where p=[c==d|c<-z,d<-z]
l=fromIntegral.length

0

সিজেম, 23 বাইট

1r$e`{0=,~}%_:+\,,:+d/-

বাইট- ওয়াইজ , এটি @ রেটোকোরাদি জবাবের তুলনায় খুব সামান্য উন্নতি , তবে এটি একটি ঝরঝরে কৌশল ব্যবহার করে:

প্রথম এন অ-নেতিবাচক পূর্ণসংখ্যার যোগফল n (n - 1) / 2 এর সমান , যা আমরা প্রশ্নের সূত্রে ভগ্নাংশের 2 এবং 2 দ্বারা বিভক্ত সংখ্যক এবং ডিনোমিনেটর গণনা করতে ব্যবহার করতে পারি ।

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

 r$                     e# Read a token from STDIN and sort it.
   e`                   e# Perform run-length encoding.
     {    }%            e# For each [length character] pair:
      0=                e#   Retrieve the length of the run (L).
        ,~              e#   Push 0 1 2 ... L-1.
                        e# Collect all results in an array.
            _:+         e# Push the sum of the entries of a copy.
               \,       e# Push the length of the array (L).
                 ,:+    e# Push 0 + 1 + 2 + ... + L-1 = L(L-1)/2.
                    d/  e# Cast to Double and divide.
1                     - e# Subtract the result from 1.

0

এপিএল, 26 বাইট

{1-+/÷/{⍵×⍵-1}({⍴⍵}⌸⍵),≢⍵}

ব্যাখ্যা:

  • ≢⍵: প্রথম মাত্রার দৈর্ঘ্য পান । প্রদত্ত যে একটি স্ট্রিং, এর মানে হল স্ট্রিং এর দৈর্ঘ্য হতে অনুমিত হয়।
  • {⍴⍵}⌸⍵: প্রতিটি অনন্য উপাদানের জন্য , ঘটনার তালিকার প্রতিটি মাত্রার দৈর্ঘ্য পান। এটি 1×≢⍵ম্যাট্রিক্স হিসাবে প্রতিটি আইটেমের জন্য একটি আইটেমের পরিমাণের পরিমাণ দেয় ।
  • ,: অনুভূমিক অক্ষ বরাবর দুটি একত্রিত করুন। যেহেতু ≢⍵একটি স্কেলার, এবং অন্য মানটি একটি কলাম, আমরা একটি 2×≢⍵ম্যাট্রিক্স পাই যেখানে প্রথম কলামে প্রতিটি আইটেমের জন্য একটি আইটেম সংখ্যার পরিমাণ হয় এবং দ্বিতীয় কলামে আইটেমের মোট পরিমাণ থাকে।
  • {⍵×⍵-1}: ম্যাট্রিক্সের প্রতিটি কক্ষের জন্য গণনা করুন N(N-1)
  • ÷/: বিভাগ দ্বারা সারি হ্রাস। এটি সামগ্রীর জন্য প্রতিটি আইটেমের মানকে ভাগ করে।
  • +/: প্রতিটি সারির জন্য ফলাফলের যোগফল।
  • 1-: এটি 1 থেকে বিয়োগ করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.