66 lines
1.5 KiB
Python
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
|