comercioeletronico-recomend.../libRecomendacao.py

66 lines
1.5 KiB
Python

#!/usr/bin/env python3
# -*- encoding: utf-8 *-*
from typing import Callable, List
def filtrarNonesFora(a:list,b:list):
while len(a) > len(b):
del a[-1]
while len(a) < len(b):
del b[-1]
i = len(a) - 1
while i >= 0:
if a[i] is None or b[i] is None:
del a[i]
del b[i]
i-=1
return a,b
def similaridade(
a:List[float],
b:List[float],
fail:float = 0,
)->float:
a,b = filtrarNonesFora(a[:], b[:])
if (len(a) == 0) or (len(b) == 0):
return fail
rabar = sum(a)/len(a)
rbbar = sum(b)/len(b)
num = 0
dn1 = 0
dn2 = 0
for p in range(len(a)):
num+= (a[p]-rabar)*(b[p]-rbbar)
for p in range(len(a)):
dn1+= (a[p]-rabar)**2
for p in range(len(a)):
dn2+= (b[p]-rbbar)**2
try:
return num/((dn1**0.5)*(dn2**0.5))
except:
return fail
def predicao(
a:List[float],
n:List[List[float]],
p:int,
sim:Callable[[list,list], float] = similaridade,
)->float:
nonesOut = (lambda nn: list(filter((lambda a: a is not None), nn)))
rabar = sum(nonesOut(a))/len(nonesOut(a))
num = 0
den = 0
for b in n:
if b[p] is None:
continue
simAB = sim(a,b)
if simAB is None:
continue
rbbar = sum(nonesOut(b))/len(nonesOut(b))
num+= simAB*(b[p]-rbbar)
den+= simAB
try:
return rabar+(num/den)
except:
return 0