天天看點

[總結]集體智慧程式設計中用到的資料評估模型

做資料分析時,資料間權重和距離的計算是最常見的也是很重要的問題。快速掃了一遍集體智慧程式設計的相關分類,推薦算法後,

對資料的模組化預處理整理總結下,以備以後使用。

一、資料間的相似度,距離計算

1.歐幾裡得距離(第二章)

最簡單直覺的計算方式,直接計算兩組資料間的屬性距離,對每一項屬性求差平方和再相加開平方。

值域[0,正無窮),可以取倒數1/(1+dis)。映射到(0,1]的區間,值越大距離越近。

python源代碼如下

# Returns a distance-based similarity score for person1 and person2
def sim_distance(prefs,person1,person2):
  # Get the list of shared_items
  si={}
  for item in prefs[person1]:
    if item in prefs[person2]: si[item]=1

  # if they have no ratings in common, return 0
  if len(si)==0: return 0
  # Add up the squares of all the differences
  sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
                      for item in prefs[person1] if item in prefs[person2]])

  return 1/(1+sum_of_squares)
           

處理規範資料時好用,但是如果資料間值偏差比較大,計算效果不理想。

2.皮爾遜相關度評價(第二章)

相比歐幾裡得跟複雜一些,計算兩個資料在一條直線上的拟合程度,對于大偏差的資料集效果更好。

在第三章部落格文章計算單詞距離時也是用到,歐幾裡得距離無法有效評估兩篇單詞數相差很大的文章的距離

# Returns the Pearson correlation coefficient for p1 and p2
def sim_pearson(prefs,p1,p2):
  # Get the list of mutually rated items
  si={}
  for item in prefs[p1]:
    if item in prefs[p2]: si[item]=1

  # if they are no ratings in common, return 0
  if len(si)==0: return 0

  # Sum calculations
  n=len(si)

  # Sums of all the preferences
  sum1=sum([prefs[p1][it] for it in si])
  sum2=sum([prefs[p2][it] for it in si])

  # Sums of the squares
  sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
  sum2Sq=sum([pow(prefs[p2][it],2) for it in si])

  # Sum of the products
  pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])

  # Calculate r (Pearson score)
  num=pSum-(sum1*sum2/n)
  den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
  if den==0: return 0

  r=num/den

  return r
           

二、資料集的混亂程度評估

1.基尼不純度(第七章)

來自集合中的某種結果随機應用于集合中的某一類别的預期誤差率。

如果集合中所有資料都是同一分類則誤差率為0,如果有4種可能則誤差率為0.75

def uniquecounts(rows):
   results={}
   for row in rows:
      # The result is the last column
      r=row[len(row)-1]
      if r not in results: results[r]=0
      results[r]+=1
   return results
           
def giniimpurity(rows):
  total=len(rows)
  counts=uniquecounts(rows) 
  imp=0
  for k1 in counts:
    p1=float(counts[k1])/total
    for k2 in counts:
      if k1==k2: continue
      p2=float(counts[k2])/total
      imp+=p1*p2
  return imp
           

2.熵

越混亂熵值越高(第七章)

def entropy(rows):
   from math import log
   log2=lambda x:log(x)/log(2)
   results=uniquecounts(rows)
   # Now calculate the entropy
   ent=0.0
   for r in results.keys():
      p=float(results[r])/len(rows)
      ent=ent-p*log2(p)
   return ent
           

熵和基尼不純度的主要差別在于,熵到達峰值的過程要相對慢一些,是以熵對于混亂集合的“判罰”程度要更重。

三、權重比例模型

對于一些值進行預估,或者計算某一屬性的時候,通常需要利用已有的值進行計算,這時可能需要對不同的資料添加

對應的權值。

1.反函數

v = 1/(val+0.1)

執行速度快,容易實作,缺點在于衰減速度快,對噪聲敏感。

2.減法函數

v=const-val>0?const-val:0

3.高斯函數

在距離為0時權重值為1,并且權重值随着距離增加而減少,但是不會衰減到0

def gaussian(dist,sigma=5.0):

  return math.e**(-dist**2/(2*sigma**2))

附錄:常用的距離度量函數

令X=(x1,x2,..,xn)T,Y=(y1,y2,...yn)T為兩個輸入向量,

歐幾裡得距離(Euclidean distance)-EuclideanDistanceMeasure.

[總結]集體智慧程式設計中用到的資料評估模型

相當于高維空間内向量說表示的點到點之間的距離。

由于特征向量的各分量的量綱不一緻,通常需要先對各分量進行标準化,使其與機關無關,比如對身高(cm)和體重(kg)兩個機關不同的名額使用歐式距離可能使結果失效。

優點:簡單,應用廣泛(如果也算一個優點的話)

缺點:沒有考慮分量之間的相關性,展現單一特征的多個分量會幹擾結果。

馬氏距離(Mahalanobis distance)-MahalanobisDistanceMeasure

C=E[(X-X平均)(Y-Y平均)]為該類輸入向量X的協方差矩陣.(T為轉置符号,E取平均時是樣本是以為n-1)

适用場合:

1)度量兩個服從同一分布并且其協方差矩陣為C的随機變量X與Y的差異程度

2)度量X與某一類的均值向量的差異程度,判别樣本的歸屬。此時,Y為類均值向量.

優點:

1)獨立于分量量綱

2)排除了樣本之間的相關性影響。

缺點:不同的特征不能差别對待,可能誇大弱特征。

闵可夫斯基距離(Minkowsk distance)-MinkowskiDistanceMeasure(預設p=3)

[總結]集體智慧程式設計中用到的資料評估模型

可看成是歐氏距離的指數推廣,還沒有見到過很好的應用執行個體,但通常,推廣都是一種進步,特别的,

當p=1,也成做曼哈頓距離,也稱絕對距離,曼哈頓距離來源于城市區塊距離,是将多個次元上的距離進行求和後的結果。ManhattanDistanceMeasure.

[總結]集體智慧程式設計中用到的資料評估模型

當q=∞時,稱為切比雪夫距離,ChebyshevDistanceMeasure 

切比雪夫距離起源于國際象棋中國王的走法,我們知道國際象棋國王每次隻能往周圍的8格中走一步,那麼如果要從棋盤中A格(x1, y1)走到B格(x2, y2)最少需要走幾步?擴充到多元空間,其實切比雪夫距離就是當p趨向于無窮大時的明氏距離:

[總結]集體智慧程式設計中用到的資料評估模型

漢明距離(Hamming distance)-Mahout無

在資訊論中,兩個等長字元串之間的漢明距離是兩個字元串對應位置的不同字元的個數。換句話說,它就是将一個字元串變換成另外一個字元串所需要替換的字元個數。

    例如:

    1011101 與 1001001 之間的漢明距離是 2。

    2143896 與 2233796 之間的漢明距離是 3。

    "toned" 與 "roses" 之間的漢明距離是 3。

Tanimoto系數(又稱廣義Jaccard系數)-TanimotoDistanceMeasure.

[總結]集體智慧程式設計中用到的資料評估模型

通常應用于X為布爾向量,即各分量隻取0或1的時候。此時,表示的是X,Y的公共特征的占X,Y所占有的特征的比例。

Jaccard系數

Jaccard系數主要用于計算符号度量或布爾值度量的個體間的相似度,因為個體的特征屬性都是由符号度量或者布爾值辨別,是以無法衡量差異具體值 的大小,隻能獲得“是否相同”這個結果,是以Jaccard系數隻關心個體間共同具有的特征是否一緻這個問題。如果比較X與Y的Jaccard相似系數, 隻比較xn和yn中相同的個數,公式如下:

[總結]集體智慧程式設計中用到的資料評估模型

皮爾遜相關系數(Pearson correlation coefficient)-PearsonCorrelationSimilarity

即相關分析中的相關系數r,分别對X和Y基于自身總體标準化後計算空間向量的餘弦夾角。公式如下:

[總結]集體智慧程式設計中用到的資料評估模型

餘弦相似度(cosine similarity)-CosineDistanceMeasure

[總結]集體智慧程式設計中用到的資料評估模型

就是兩個向量之間的夾角的餘弦值。

餘弦相似度用向量空間中兩個向量夾角的餘弦值作為衡量兩個個體間差異的大小。相比距離度量,餘弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。

優點:不受坐标軸旋轉,放大縮小的影響。

9.調整餘弦相似度-Adjusted Cosine Similarity

雖然餘弦相似度對個體間存在的偏見可以進行一定的修正,但是因為隻能分辨個體在維之間的差異,沒法衡量每個維數值的差異,會導緻這樣一 個情況:比如使用者對内容評分,5分制,X和Y兩個使用者對兩個内容的評分分别為(1,2)和(4,5),使用餘弦相似度得出的結果是0.98,兩者極為相 似,但從評分上看X似乎不喜歡這2個内容,而Y比較喜歡,餘弦相似度對數值的不敏感導緻了結果的誤差,需要修正這種不合理性,就出現了調整餘弦相似度,即 所有次元上的數值都減去一個均值,比如X和Y的評分均值都是3,那麼調整後為(-2,-1)和(1,2),再用餘弦相似度計算,得到-0.8,相似度為負 值并且差異不小,但顯然更加符合現實。

調整餘弦相似度和餘弦相似度,皮爾遜相關系數在推薦系統中應用較多。在基于項目的推薦中,GroupLens有篇論文結果表明調整餘弦相似度性能要優于後兩者。

10.基于權重的距離計算方法:

WeightedDistanceMeasure、WeightedEuclideanDistanceMeasure 、 WeightedManhattanDistanceMeasure

歐氏距離與餘弦相似度

借助三維坐标系來看下歐氏距離和餘弦相似度的差別:

[總結]集體智慧程式設計中用到的資料評估模型

根據歐氏距離和餘弦相似度各自的計算方式和衡量特征,分别适用于不同的資料分析模 型:歐氏距離能夠展現個體數值特征的絕對差異,是以更多的用于需要從次元的數值大小中展現差異的分析,如使用使用者行為名額分析使用者價值的相似度或差異;而 餘弦相似度更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用于使用使用者對内容評分來區分使用者興趣的相似度和差異,同時修正了使用者間可能存在的度 量标準不統一的問題(因為餘弦相似度對絕對數值不敏感)。

繼續閱讀