前言:
找工作時(IT行業),除了常見的軟體開發以外,機器學習崗位也可以當作是一個選擇,不少電腦的研究生都會接觸這個,如果你的研究方向是機器學習/資料採礦之類,且又對其非常感興趣的話,可以考慮該崗位,畢竟在機器智能沒有達到人類水平之前,機器學習可以作為一種重要的手段,而隨著科技的不斷髮展,相信這方面的人才需求也會越來越大。 監督(supervised) 分類(classification) 1.knn(k Nearest Neighbors)演算法:
關鍵公式: d=(∑(xi−xtest)2)12 d=\left(\sum (x_i-x_{test})^2\right)^{\frac{1}{2}}
虛擬碼(pseudo_code):
計算訓練集中到該點的距離
選擇距離最小的k個點
返回k個點出現頻率最高的類別作為當前點的預測分類
def knn(in_x, data_set, labels, k): diff_mat = tile(in_x, (data_size,1)) - data_set sq_diff_mat = diff_mat**2 distances = sq_diff_mat.sum(axis=1)**0.5 sorted_dist_indicies = distances.argsort() for i in xrange(k): vote_label = labels[sorted_dist_indicies[i]] class_count[vote_label] = class_count.get(vote_label, 0) + 1 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]
2.決策樹:
關鍵公式: H(x)=−∑P(xi)log2(P(xi)) H(x)=-\sum P(x_i)log_2(P(x_i))
決策樹中很重要的一點就是根據資訊熵的大小選擇一個屬性進行分枝,因此要注意一下資訊熵的計算公式,並深入理解它。
虛擬碼(pseudo_code):
檢測資料集中的每個子項是否屬於同一分類:
If so return 類標籤;
Else
尋找劃分資料集的最好特徵
建立分支節點
for 每個劃分的子集
調用函數createBranch並增加返回結果到分支節點中
return 分支節點
原則只有一個,盡量使得每個節點的樣本標籤儘可能少,注意上面虛擬碼中一句說:find the best feature to split the data,那麼如何find thebest feature?一般有個準則就是盡量使得分支之後節點的類別純一些,也就是分的準確一些。如(圖一)中所示,從海洋中撈取的5個動物,我們要判斷他們是否是魚,先用哪個特徵。
(圖一)
為了提高識別精度,我們是先用“離開陸地能否存活”還是“是否有蹼”來判斷。我們必須要有一個衡量準則,常用的有資訊理論、基尼純度等,這裡使用前者。我們的目標就是選擇使得分割後資料集的標籤資訊增益最大的那個特徵,資訊增益就是未經處理資料集標籤基熵減去分割後的資料集標籤熵,換句話說,資訊增益大就是熵變小,使得資料集更有序。熵( 偉大的人物)計算如(公式一)所示:
H=−∑ni=1p(xi)log2p(xi) H=-\sum_{i=1}^n p(x_i)log_2p(x_i)
(公式一)
其中n代表有n個分類類別(比如假設是二類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率 p1 p_1和 p2 p_2,這樣就可以計算出未選中屬性分枝前的資訊熵。
3. 樸素貝葉斯(Naive Bayes)
關鍵公式: P(A|B)=P(A∩B)P(B) P(A|B)=\dfrac{P(A\cap B)}{P(B)}
為什麼
機器學習的一個重要應用就是文檔的自動分類。在文檔分類中,整個文檔(如一封電子郵件)是執行個體,而電子郵件中的某些元素則構成特徵。我們可以觀察文檔中出現的詞,並把每個詞的出現或者不出現作為一個特徵,這樣得到的特徵數目一樣多。假設詞彙表中有1000個單詞。要得到好的機率分布,就需要足夠的資料樣本,假定樣本數為N。由統計學知,如果每個特徵需要N個樣本,那麼對於10個特徵將需要 N10個樣本 N^{10}個樣本,對於包含1000個特徵的詞彙表將需要 N1000 N^{1000}個樣本。可以看到,所需要的樣本數會隨著特徵樹木增大而迅速增長。
如果特徵之間相互獨立,那麼樣本樹就可以從 N1000