《集体智慧编程》数学公式

这篇博客的目的主要是为了记录这些公式,取自原书附录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系数公式
代码实现:

#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)
用途:计算向量的夹角
公式:
点积公式1
点积公式2
代码实现:

#点积
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章