《集體智慧編程》數學公式

這篇博客的目的主要是爲了記錄這些公式,取自原書附錄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

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