具體代碼可以看github:代碼github
Ch2:k - 近鄰算法
一,k近鄰算法的工作原理:
存在一個樣本數據集,也稱作訓練數據集,並且樣本集中每個數據都存在標籤,即我們知道樣本集中每個數據與所屬分類的對應關係。當輸入沒有標籤的新數據後,將新數據的每個特徵與樣本集中數據對應的特徵進行比較,然後算法提取樣本集中特徵最相似的數據的分類標籤。一般來說,我們只選擇樣本數據集中最相似的k個數據(通常k不大於20),再根據多數表決原則,選擇k個最相似數據中出現次數最多的分類,作爲新數據的分類。
k近鄰算法的一般流程:
(1)收集數據:可以採用公開的數據源
(2)準備數據:計算距離所需要的數值
(3)分析數據:剔除垃圾信息
(4)測試算法:計算錯誤率
(5)使用算法:運用在實際中,對實際情況進行預測
二、實戰
k近鄰算法對未知類別屬性的數據集中每個點依次執行如下步驟:
1)計算已知類別數據集中的點與當前點之間的距離
2)按照距離遞增次序排序
3)選取與當前點距離最小的k個點
4)確定前k個點所在類別的出現頻率
5)返回前k個點出現頻率最高的類別作爲當前點的預測分類
'''
使用 kNN 進行分類(約會網站配對)
@param inX:用於分類的數據向量
@param dataSet:訓練樣本集
@param labels:標籤向量
@param k:用於選擇最近鄰的數目
'''
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
# 求inX與數據集中各個樣本的歐氏距離
diffMat = tile(inX, (dataSetSize,1)) - dataSet # np.tile 複製inX 4*1
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1) # 按照x軸相加
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort() # 從小到大排序後,返回索引
# 字典,key存儲第i小的標籤值,value爲標籤的次數
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] # 取第i個小的標籤值
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 # 根據標籤統計標籤次數,如果沒找到返回0。統計前k個候選者中標籤出現的次數
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) # operator.itemgetter(1) 按照第2個元素,即標籤出現的次數對classCount從大到小排序
# print(sortedClassCount) # 測試結果 [('B', 2), ('A', 1)]
return sortedClassCount[0][0] # 返回最終的類別,即標籤值key
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group, labels
# 測試kNN
group, labels = createDataSet()
ans = classify0([0,0], group, labels, 3)
print(ans)
Ch3:決策樹
檢測數據集中的每一個子項是否屬於同一分類:
僞代碼:
if so return 類標籤;
else
尋找劃分數據集的最好特徵
劃分數據集
創建分支結點
for 每個分支結點
調用函數createBranch並增加返回結點到分支結點中//遞歸調用createBranch()
return 分支結點
我們可以總結出決策樹的一般流程:
(1)收集數據
(2)準備數據:構造樹算法只適用於標稱型數據,因此數值型數據必須離散化
(3)分析數據
(4)訓練數據:上述的構造樹過程構造決策樹的數據結構
(5)測試算法:使用經驗樹計算錯誤率
(6)使用算法:在實際中更好地理解數據內在含義
Ch4:基於概率論的分類方法:樸素貝葉斯
Ch5:Logistic 迴歸
梯度下降法更新權重:
Ch6:支持向量機
#SMO算法的僞代碼
#創建一個alpha向量並將其初始化爲0向量
#當迭代次數小於最大迭代次數時(w外循環)
#對數據集中每個數據向量(內循環):
#如果該數據向量可以被優化:
#隨機選擇另外一個數據向量
#同時優化這兩個向量
#如果兩個向量都不能被優化,退出內循環
#如果所有向量都沒有被優化,增加迭代次數,繼續下一次循環
Ch7:利用 AdaBoost 元算法提高分類性能
Boosting 中最流行的的一個算法是 AdaBoost,以弱學習器作爲基分類器,並且輸入數據,使其通過權重向量進行加權。在第一次迭代中,所有數據等權重,在後續迭代中,前次迭代中分錯的數據的權值增大,這種針對錯誤的調節能力正是 AdaBoost 的長處。
Ch8:預測數值型數據:迴歸
參考: