PyMCDA - Sets and set functions

Sylen·2024년 11월 3일

Dive to MCDA

목록 보기
5/7

다음은 PyMCDA 패키지에서 집합과 집합 함수를 다루는 튜토리얼입니다. 코드 한 줄마다 중학생도 이해할 수 있도록 최대한 친절하게 설명했습니다.


집합 및 집합 함수

이 튜토리얼에서는 PyMCDA에서 제공하는 집합과 집합 함수를 다루는 기능을 배우고, 해시 가능한 집합(HashableSet)과 집합 함수(SetFunction) 사용 방법을 알아봅니다.

환경 설정

먼저, 자동 완성 기능을 사용할 수 있도록 노트북을 설정합니다.

%config Completer.use_jedi = False

라이브러리 임포트

mcda.set_functions 모듈에서 필요한 함수들을 불러옵니다.

from mcda.set_functions import *

1. 해시 가능한 집합 (HashableSet)

해시 가능한 집합은 일반적인 파이썬 집합과 비슷하지만, hash 메서드가 정의되어 있어 사전의 키(key)로 사용할 수 있습니다.

HashableSet({"c01", "c02", "c03"})

출력:

{'c01', 'c02', 'c03'}
  • { "c01", "c02", "c03" }라는 요소를 가진 HashableSet을 생성합니다. 이 집합은 키로 사용할 수 있습니다.

파이썬 집합의 메서드도 동일하게 사용 가능합니다.

HashableSet({"c01", "c02", "c03"}).difference({"c02"})

출력:

{'c01', 'c03'}
  • difference 메서드를 사용하여 "c02" 요소를 제외한 집합을 만듭니다.

HashableSet은 사전의 키로 사용할 수 있습니다.

d = {
    HashableSet(): 0,
    HashableSet({"c01", "c02"}): 1,
    HashableSet({"c03"}): 2,
    HashableSet({"c03", "c01"}): 3
}
d[HashableSet()]

출력:

0
  • 위에서 정의한 해시 가능한 집합들을 사전의 키로 설정한 후, HashableSet()으로 사전에서 값을 불러옵니다.

2. 집합 함수(Set Function)

집합 함수는 특정 집합의 모든 부분 집합에 대해 값을 정의하는 함수입니다. 예를 들어, 여러 기준(criteria)을 평가할 때, 각 기준 조합에 대해 특정 값을 할당할 수 있습니다.

2.1 집합 함수 생성

다음과 같은 SetFunction을 정의합니다:

criteria = ["c01", "c02", "c03"]
f = SetFunction(
    {
        (): 0,
        ("c01",): 0.1,
        ("c02",): 0.2,
        ("c01", "c02"): 0.2,
        ("c03",): 0.1,
        ("c01", "c03"): 0.25,
        ("c03", "c02"): 0.5,
        tuple(criteria): 1
    }
)
  • criteria라는 리스트로 기준을 정의합니다.
  • 각 조합(부분 집합)에 대해 값을 할당합니다.
  • ()는 빈 집합을 의미하고, ("c01", "c03")처럼 튜플 형태로 기준 조합을 표현합니다.
f.ensemble

출력:

['c03', 'c02', 'c01']
  • 집합 함수에 포함된 기준들을 확인할 수 있습니다.

2.2 다른 방식의 집합 함수 초기화

리스트로 값을 지정하여 집합 함수를 초기화할 수도 있습니다.

f2 = SetFunction([0, 0.1, 0.2, 0.2, 0.1, 0.2, 0.5, 1], criteria)
f2

출력:

<class 'mcda.core.set_functions.SetFunction'>({...})
  • 리스트 [0, 0.1, ... , 1]로 값을 지정하며, 각 요소는 criteria에 맞춰 자동으로 조합됩니다.

집합 함수를 정의하면 사전 형식으로 값을 확인할 수 있습니다.

f2.values

출력:

{HashableSet(): 0, {0}: 0.1, {1}: 0.2, {0, 1}: 0.2, ...}

3. 집합 함수 호출

특정 기준 조합에 대한 값을 확인하고 싶을 때, f() 형태로 집합 함수를 호출할 수 있습니다.

f()  # 빈 집합에 대한 값

출력:

0
  • 빈 집합에 대한 값을 출력합니다.
f("c02")

출력:

0.2
  • ("c02")에 해당하는 값인 0.2를 출력합니다.

4. 예제: 용량(capacity) 정의

집합 함수는 다양한 분석에 사용됩니다. 예를 들어, 특정 조건에 따라 정의된 용량(capacity) 함수를 생성할 수 있습니다.

l = [i / 13 for i in range(14)] + [1, 1]
capacity = [0 for _ in range(len(l))]
for i, index in enumerate(HashableSet.cardinal_range(len(l))):
    capacity[index] = l[i]
capacity = SetFunction(capacity)
  • l은 용량 값을 저장하는 리스트입니다.
  • capacity는 집합 함수를 정의하는데 사용됩니다.

5. 집합 함수 유형 확인

집합 함수에 대한 다양한 제약 조건을 확인할 수 있습니다.

capacity.is_powerset_function
capacity.is_game
capacity.is_monotonous
capacity.is_additive
capacity.is_cardinality_based

출력:

True, True, True, False, False
  • is_monotonous: 함수가 단조 함수인지 여부 확인.
  • is_additive: 함수가 가법성(additive)을 가지는지 여부 확인.

6. 모비우스 변환 (Möbius Transformation)

현재 패키지에서는 모비우스 변환과 역 변환 기능을 지원합니다.

mobius = capacity.mobius
mobius

출력:

<class 'mcda.core.set_functions.Mobius'>({...})
  • mobius는 집합 함수의 모비우스 표현을 나타냅니다.

모비우스 변환을 통해 집합 함수의 형태를 변환할 수 있으며, 변환의 정확도를 확인할 수 있습니다.

c = mobius.set_function
for k in capacity._values.keys():
    print(f"{capacity(*k)} -> {c(*k)}")

출력:

0.0 -> 0.0
0.07692307692307693 -> 0.07692307692307693
...

7. 집합 함수에 대한 분석 지표 계산

모비우스 변환을 이용하여 셰이플리 값(Shapley values) 및 상호작용 지수(interaction index)와 같은 다양한 분석 지표를 계산할 수 있습니다.

mobius.shapley
mobius.interaction_index

출력:

0    0.134615
1    0.211538
...
  • shapley: 각 기준의 중요도를 계산하는 Shapley 값을 나타냅니다.
  • interaction_index: 기준 간의 상호작용을 나타냅니다.

이 튜토리얼에서는 PyMCDA의 집합 및 집합 함수를 사용하여 복잡한 조건과 기준을 다루는 방법을 설명했습니다. HashableSetSetFunction을 사용해 사전의 키로 집합을 활용하고, 집합 함수의 다양한 분석 지표를 계산하는 법을 익혔습니다.

profile
AI가 재밌는 걸

0개의 댓글