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