Mengdelære

Sett og settoperasjoner

Python har innebygget støtte for sett og settoperasjoner. Vi trenger dermed ikke importere noen funksjoner fra Pandas eller Numpy for å gjøre dette. Først lager vi noen sett med data, og så utfører vi noen operasjoner mot disse. Sett A er noen tippeligalag, mens sett B er lag fra Agderfylkene.

In [1]:
from IPython.display import display, Math

# Sett skrives med kommaseparerte verdier mellom { og }. Merk at { og } også brukes i dictionaries,
# men da har man også kolon for å skille nøkkel fra verdi, slik: {'key': 'value', 'key2': 'value2' ...}.
A = {'Rosenborg', 'Brann', 'Start', 'Sogndal', 'Viking'}
B = {'Start', 'Jerv', 'Vindbjart'}

# A|B betyr A union B. Kan også skrives A.union(B). Dvs. alle lagene. Se forklaring lenger nede.
Omega = A|B

# Vis Omega:
Omega
Out[1]:
{'Brann', 'Jerv', 'Rosenborg', 'Sogndal', 'Start', 'Viking', 'Vindbjart'}

Element / ikke element

Vi kan enkelt sjekke om en verdi finnes i et sett. Da bruker vi "in"-operatoren i Python. Vi kan også skrive "not in" for motsatt operasjon.

In [2]:
# Hvis x er element i A
if 'Viking' in A:
    print('Viking er et tippeligalag:')
    display(Math(r'Viking \in A'))
    
# Hvis x ikke er element i B
if 'Viking' not in B:
    print('Viking er ikke et lag fra Agderfylkene:')
    display(Math(r'Viking \notin B'))
Viking er et tippeligalag:
$$Viking \in A$$
Viking er ikke et lag fra Agderfylkene:
$$Viking \notin B$$

Union, snitt og komplement

Union og snitt er også innebyggede operasjoner. Man skriver to settvariabler, med en operator i mellom. Dette er "|" for union, og "&" for snitt. Man kan alternativt bruke A.union(B) eller A.intersection(B).

In [3]:
# Union. A|B eller A.union(B):
display(Math(r'A \cup B:'), A|B)

print('---')
# Snitt. A&B eller A.intersection(B):
display(Math(r'A \cap B:'), A&B)

print('---')
# Differanse. A-B eller A.differense(B):
display(Math(r'A \setminus B:'), A-B)
$$A \cup B:$$
{'Brann', 'Jerv', 'Rosenborg', 'Sogndal', 'Start', 'Viking', 'Vindbjart'}
---
$$A \cap B:$$
{'Start'}
---
$$A \setminus B:$$
{'Brann', 'Rosenborg', 'Sogndal', 'Viking'}

Komplement

Komplement er ikke tilgjengelig som noen operator, men hvis vi først tar union av alle verdiene, kan vi ta differanse med et av settene.

In [4]:
# Komplement
display(Math(r'A^C:'), Omega-A)
$$A^C:$$
{'Jerv', 'Vindbjart'}

Flere operasjoner sammen

Det er mulig å kombinere operasjonene vi har sett på her. Eksempel:

In [5]:
C = Omega-(A&B) # C = Omega uten snitt av A og B

print('Er Jerv element i', C, '?')

# Element-operasjon:
'Jerv' in C
Er Jerv element i {'Viking', 'Vindbjart', 'Jerv', 'Rosenborg', 'Sogndal', 'Brann'} ?
Out[5]:
True

Binomialkoeffisient / multinomialkoeffisient

Binomialkoeffisient kan vi regne ut ved hjelp av "comb"-funksjonen i Scipy. Dette er det du finner som nCr (n, choose r) på kalkulatoren. Funksjonen kan enten ta tall for n og r, eller lister. Her bruker vi tall. Vi spesifiserer også exact=True, slik at vi får et eksakt heltall som svar.

In [6]:
from scipy.misc import comb

comb(104, 7, exact=True)
Out[6]:
21243342120

Multinomialkoeffisienten er ikke like rett-frem ved bruk av de pakkene vi har til rådighet. Vi kan likevel implementere den ved hjelp av binomialkoeffisienten. Se Nyberg sin bok for mer om multinomialkoeffisienten.

In [7]:
def multinomial(n, ks):
    svar = comb(n, ks[0], exact=True) # Indekser i Python starter på 0. Binomial(n, k_1)
    
    # Trekker fra k-verdier fra n (k_1, k_2, ... k_n-2)
    # og bruker comb ved hver iterasjon for å multiplisere med tidligere svar.
    for m in range(1, len(ks)-1):
        n -= ks[m-1]
        svar *= comb(n, ks[m], exact=True)
        
    return svar

# Test av funksjonen
multinomial(31, [8,2,7,8,6])
Out[7]:
696927647152737000


Laget våren 2016, som prosjektoppgave i MA-155 Statistikk ved UiA av Olav Andreas Lindekleiv