Calcul de similarité

Fermé
cha - 11 mai 2016 à 09:06
 cha - 12 mai 2016 à 08:52
Bonjour à tous,
Je suis débutante en python et j'ai quelques difficultés a effectuer un script. J'espère vraiment que quelqu'un pourra m'aider!

Voila l'idée:
j'ai un fichier contenant: le numéro d'une molécule, son nom et 166 chiffres de 0 à 10 associés à cette molécule. (Le fichier est identique du début à la fin: le même nombre d'espace, le même nombre de chiffre (166)...).
exemple:
molécule n°1 nom: blabla 0 1 0 0 1 5 2 0 0 0 4 1 0 0 1....
molécules n°2 nom: XY 0 0 0 1 1 0 4 0 8 0 0 0 4 0 6 0 1 0 1....
.
.
.
molécules n°10 nom: CA 0 2 1 0 0 1 1 0 0 0 4 0 1 0 0 0 0 ...

Je souhaiterais calculer la similarité entre une molécule test X 0 0 1 0 1 0 1 0 2 0 1... et chacune des molécules du fichier.
Et que par la suite ce calcul soit valable pour n'importe qu'elle fichier (de même type) et n'importe qu'elle molécule test.

j'ai réussi à calculer la similarité entre une molécule test et une autre molécule mais je n'arrive pas à généraliser mon script à n'importe qu'elle molécule ni à récupérer les molécules dans le fichier pour les associer à la molécule test. Voila mon script:

a = [1,0,0,0,1,0,0,0,1,0,0,0,0,6,0,0]
b = [0,0,1,0,0,0,0,0,0,0,0,4,0,0,0,1]


def tanimoto(a, b):
intersection = [val for val in b if val in a]
return float(len(intersection))/(len(a)+len(b)-len(intersection))

print tanimoto(a,b)

Merci à tous pour vos réponses et de m'aider pour cette exercice.
A voir également:

4 réponses

jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
11 mai 2016 à 15:27
Inspire-toi peutêtre de ceci
#! /usr/bin/python
import sys
import re

def readData( fname = "data.txt"):
    
    try:
        filo = open( fname , "r")
    except:
        print("Cannot opent '%s' for readinf" % (fname) )
        sys.exit("Cannot opent '%s' for readinf" % (fname))

    data = {}
    line = filo.readline().rstrip()
    
    
    while( line ) :
        fields = None
        fields =  re.split(" +", line);
        molecule  = fields[0]
        data[molecule] = fields[1:]

        line = filo.readline().rstrip()

    filo.close()
    return data

print(readData()) 
Exécution:<code>johand@bata:~/src/CCM/PYTHON$ cat data.txt
CACO3 0 1 2 3
UF6 9 9 8 1
NAN3 9 9 9 9
johand@bata:~/src/CCM/PYTHON$ python chem01.py
{'NAN3': ['9', '9', '9', '9'], 'CACO3': ['0', '1', '2', '3'], 'UF6': ['9', '9', '8', '1']}

0
Merci pour ta réponse jisisv.

Cependant je n'ai pas du être assez clair sur mes idées car cela ne correspond pas tout à fait à ce dont je voulais. Pourras-tu m'aider encore?

Je souhaiterais comparer chacune des 166 valeurs de ma molécule test avec les 166 valeurs des molécules de mon fichier.
Et ainsi calculer une distance entre chaque molécules.
Exemple:
molécules test 0 1 0 0 0 1 0 2
molécule 1 de la base 1 2 0 0 5 0 0 1
trouver la distance entre (1-0, 2-1, 0-0,0-0,5-0,0-1,0-0,1-2)?

molécule test
molécule 2 de la base etc..

J'avais déjà réussi à récupérer les molécules de mon fichier.
Cependant je n'arrive pas à relier la molécule test désigner au départ (à l'extérieur du fichier!) aux molécules de mon fichier justement.
Comment calculer cette distance entre chaque élément?pour chacune des molécules?

Merci d'avance!!
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
11 mai 2016 à 17:51
Inspire-toi de
def mon_traitement( m1, m2):
    # validation a effectuer
    for i in range( len( m1) ) :
        print("%s - %s" %(m1[i], m2[i]))
        
results = readData()

test = (4, 3, 2, 1)
mon_traitement(results["CACO3"], test)


Test est ici un tuple (unmutable) , mais cela pourrait être une liste.
0
Merci!!
je vais essayer ca alors.
0