这篇博客的目的主要是为了记录这些公式,取自原书附录B。
1.欧几里得距离(Euclidean Distance)
用途:计算距离,衡量相似度
公式:
代码实现:
def euclidean(p, q):
sumSq = 0.0
#将差值的平方累加起来
for i in range(len(p)):
sumSq += (p[i] - q[i]) ** 2
#求平方根
return (sumSq ** 0.5)
2.皮尔逊相关系数(Pearson Correlation Coefficient)
用途:度量相关程度,也被用来衡量相似度
公式:
代码实现:
def pearson(x, y):
n = len(x)
vals = range(n)
#简单求和
sumx = sum([float(x[i]) for i in vals])
sumy = sum([float(y[i]) for i in vals])
#求平方和
sumxSq = sum([x[i] ** 2.0 for i in vals])
sumySq = sum([y[i] ** 2.0 for i in vals])
#求乘积之和
pSum = sum([x[i] * y[i] for i in vals])
#计算皮尔逊评价值
num = pSum - (sumx * sumy / n)
den = ((sumxSq - pow(sumx, 2) / n) * (sumySq - pow(sumy, 2) / n)) ** 0.5
if den == 0:
return 1
r = num / den
return r
3.加权平均(Weighted Mean)
用途:求平均,以相似度为权重预测结果
公式:
代码实现:
#加权平均
def weightedmean(x, w):
num = sum([x[i] * w[i] for i in range(len(w))])
den = sum([w[i] for i in range(len(w))])
if den == 0:
return 1
return num / den
4.Tanimoto系数(Tanimoto Coefficient)
用途:度量两个集合的相似程度,衡量相似度
公式:
代码实现:
#Tanimoto系数
def tanimoto(a, b):
c = [v for v in a if v in b]
return float(len(c)) / (len(a) + len(b) - len(c))
5.条件概率(Conditional Probability)
用途:用于预测
公式:
代码实现:
#条件概率
def condprobability(pab, pb):
return pab / pb
6.基尼不纯度(Gini Impurity)
用途:度量一个集合有多纯
公式:
代码实现:
#基尼不纯度
def giniimpurity(l):
total = len(l)
counts = {}
for item in l:
counts.setdefault(item, 0)
counts[item] += 1
imp = 0
for j in l:
f1 = float(counts[j]) / total
for k in l:
if j == k:
continue
f2 = float(counts[j]) / total
imp += f1 * f2
return imp
7.熵(Entropy)
用途:也是用来判断集合的混乱程度
公式:
代码实现:
#熵
def entropy(l):
from math import log
log2 = lambda x : log(x) / log(2)
total = len(l)
counts = {}
for item in l:
counts.setdefault(item, 0)
counts[item] += 1
ent = 0
for i in counts:
p = float(counts[i]) / total
ent -= p * log2(p)
return ent
8.方差(Variance)
用途:度量预测或分类结果
公式:
代码实现:
#方差
def variance(vals):
mean = float(sum(vals)) / len(vals)
s = sum([(v - mean) ** 2 for v in vals])
return s / len(vals)
9.高斯函数(Gaussian Function)
用途:可用作权重函数
公式:
代码实现:
#高斯函数
import math
def gaussian(dist, sigma = 10.0):
exp = meth.e ** (-dist ** 2 / (2 * sigma ** 2))
return (1 / (sigma * (2 * math.pi) ** 0.5)) * exp
10.点积(Dot-Products)
用途:计算向量的夹角
公式:
代码实现:
#点积
from math import acos
#计算两向量的点积
def dotproduct(a, b):
return sum([a[i] * b[i] for i in range(len(a))])
#计算一个向量的大小
def veclength(a):
return sum([a[i] for i in range(len(a))]) * 0.5
#计算两个向量间的夹角
def angle(a, b):
dp = dotproduct(a, b)
la = veclength(a)
lb = veclength(b)
costheta = dp / (la * lb)
return acos(costheta)
参考资料:
《集体智慧编程》附录B