Muszę stworzyć program dodający wyniki obliczeń odległości między zbiorami do macierzy odległości.
Wyniki mam aktualnie w postaci listy, ale jeśli to konieczne mogę zmienić.
Przykład:
Dla wyników działań: 1. zbiór z 2., 1. z 3. i 2. z 3.
lista = [1.25, 3, 1.5]
program utworzy macierz 3x3:
[[0, 1.25, 3],
[1.25, 0, 1.5],
[3, 1.5, 0]]
- Rejestracja:prawie 5 lat
- Ostatnio:prawie 5 lat
- Postów:5
- Rejestracja:prawie 5 lat
- Ostatnio:prawie 5 lat
- Postów:5
Odległość obliczamy jako ułamek, w którego liczniku znajduje się suma liczby elementów należących tylko do A albo tylko do B, a w mianowniku łączna liczba elementów sumy zbiorów A i B. Mój program pobiera z pliku zbiory, oblicza odległość i dodaje do listy. Aktualnie mam coś takiego:
lista = []
plik = open("plik.txt","r")
for i in plik:
zbiory = i.split(", ")
A = set(zbiory[0])
B = set(zbiory[1])
a = len(A.difference(B))
b = len(B.difference(A))
c = len(A.union(B))
metryka = (a*b)/c
lista.append(round(metryka, 2))
print(lista)
plik.close()

- Rejestracja:około 8 lat
- Ostatnio:minuta
- Postów:4883
Odległość obliczamy jako ułamek, w którego liczniku znajduje się suma liczby elementów należących tylko do A albo tylko do B, a w mianowniku łączna liczba elementów sumy zbiorów A i B
Ta definicja nie spełnia definicji metryki, co, na przykład, z odległością zbiorów zeroelementowych? Nie mówiąc o tym, że nie jest to funkcja - skoro dla jednego punktu z dziedziny może przybierać różne wartości.
Gdybyś naprawił definicję odległości, dalej nie widzę sposobu tworzenia tej macierzy...

- Rejestracja:ponad 7 lat
- Ostatnio:około 2 godziny
lion137 napisał(a):
Gdybyś naprawił definicję odległości, dalej nie widzę sposobu tworzenia tej macierzy...
Da się, na podstawie samej analizy wejścia i wyjścia:
from itertools import combinations
lista = [1.25, 3, 1.5]
comb_list = [list(j) for i,j in enumerate(combinations(lista, 2))]
for i,j in enumerate(comb_list):
j.insert(i, 0)
print(comb_list)
# [[0, 1.25, 3], [1.25, 0, 1.5], [3, 1.5, 0]]
Przy czym to nie jest do końca dobre rozwiązanie. Ono zadziała tylko, jeśli mamy N
-elementową listę i N-1
kombinacji.
- Rejestracja:prawie 5 lat
- Ostatnio:prawie 5 lat
- Postów:5
Przykład dla macierzy 4x4.
W pliku mam zapisane dane w taki sposób (wszystkie możliwe kombinacje):
zbiór1 zbiór2
zbiór1 zbiór3
zbiór1 zbiór4
zbiór2 zbiór3
zbiór2 zbiór4
zbiór3 zbiór4
Teraz przykładowe wartości jakie z nich powstały (wymyślam, bo nie mam napisanych przykładowych zbiorów):
[0.8, 1.2, 4.3, 5, 7, 0.2]
Macierz:
[[0, 0.8, 1.2, 4.3],
[0.8, 0, 5, 7],
[1.2, 5, 0, 0.2],
[4.3, 7, 0.2, 0]]
- Rejestracja:prawie 5 lat
- Ostatnio:prawie 5 lat
- Postów:5
Bardo możliwe, że źle zabieram się do tego zadania. Mam do zrobienia program, który z pliku pobiera zbiory, liczy je metryką Marczewskiego–Steinhausa, a następnie tworzy macierz odległości.
- Rejestracja:prawie 5 lat
- Ostatnio:prawie 5 lat
- Postów:5
Definicja: Odległość to ułamek, w którego liczniku znajduje się liczba elementów różnicy symetrycznej zbiorów A i B (liczba elementów należących tylko do A albo tylko do B), a w mianowniku — łączna liczba elementów sumy zbiorów A i B. Muszę otrzymać macierz odlległości. Dane ze zbiorami muszą być pobierane z pliku. To jedyne informacje jakie mam w zadaniu.
3
elementów, czy dla dowolnegoN
? Jeśli dlaN
, to czy mógłbyś rozpisać wynikową macierz dla4
elementów? Bo dla3
zrobiłem, ale nie jest to generyczne rozwiązanie dla większej liczby elementów.