前言
在大學裏,最好的方面不是你研修的課程或從事的研究,而是一些外圍活動:與人會面、參加研討會、加入組織、旁聽課程,以及學習未知的知識。
一個機構會僱傭一些理論家(思考者)以及一些做實際工作的人(執行者)。前者可能會將大部分時間花在學術工作上,他們的日常工作就是基於論文產生思路,然後通過高級工具或教學進行建模。後者則通過編寫代碼與真實世界交互,處理非理想世界中的瑕疵,比如崩潰的及其或帶噪聲的數據。並不能完全區分兩類人。
第一部分 分類
前兩部分主要探討監督學習。監督學習一般使用兩種類型的目標變量:標稱型(有限目標集)和數值型(無限的數值集合)。
第 1 章 機器學習基礎
機器學習能讓我們自數據集中受到啓發,換句話說,我們會利用計算機來彰顯數據背後的真實含義。
1.1 何謂機器學習
機器學習就是把無數的數據轉換成有用的信息。
機器學習橫跨計算機科學、工程技術和統計學等多個學科,對於任何需要解釋並操作數據的領域都有所裨益。
機器學習用到了統計學知識,因爲現實世界中很多例子我們無法位置簡歷精確的數學模型,所以需要統計學工具。
1.1.1 傳感器和海量數據
互聯網有大量的非人爲數據,舉了地震預測的例子,講述了移動計算和傳感器產生海量數據。
1.1.2 機器學習非常重要
大量的經濟活動都依賴於信息,我們不能再海量的數據中迷失,機器學習將有助於我們穿越數據霧靄,從中抽取出有用的信息。
1.2 關鍵術語
特徵、分類、訓練集、目標變量、測試數據、知識表示
1.3 機器學習的主要任務
監督學習:分類和迴歸。無監督學習:聚類和密度估計。
1.4 如何選擇合適的算法
必須考慮兩個問題:一、使用機器學習算法的目的,想要算法完成何種任務。二、需要分析或收集的數據是什麼。
1.5 開發機器學習應用程序的步驟
1、收集數據
2、準備輸入數據
3、分析輸入數據
4、訓練算法
5、測試算法
6、使用算法
1.6 Python語言的優勢
三個原因:(1)Python的語法清晰;(2)易於操作純文本文件;(3)使用廣泛,存在大量的開發文檔。
1.6.1 可執行僞代碼
Python具有清晰的語法結構,並且語言處理和操作文本文件非常簡單。
1.6.2 Python比較流行
1.6.3 Python語言的特色
和MATLAB相比是免費的,其插件是開源的。
和Java、C相比,不需要編寫大量冗餘的代碼。
1.6.4 Python語言的缺點
運行效率不高。
1.7 NumPy函數庫基礎
幾個命令random.rand(4,4)產生4*4的隨機數組。
randMat=mat(random.rand(4*4))產生矩陣
矩陣與數組的區別~
randMat.I 矩陣的逆 eye(n)n階單位陣
1.8 本章小結
機器學習廣泛應用於日常生活中,每天處理的數據不斷增加,能夠深入理解數據背後的真實含義,是數據驅動產業必須具備的基本技能。
第 2 章 k-近鄰算法
知乎大神的相關筆記!
首先,我們將探討k-近鄰算法的基本理論,以及如何使用距離測量的方法分類物品;其次我們將使用Python從文本文件中導入並解析數據;再次,本書討論了當存在許多數據來源時,如何避免計算距離時可能碰到的一些常見錯誤;最後,利用實際的例子講解如何是所有k-近鄰算法改進約會網站和手寫數字識別系統。
2.1 k-近鄰算法概述
簡單地說,k-近鄰算法採用測量不同特徵值之間的距離方法進行分類。
k-近鄰算法
優點:精度高、對異常值不敏感,無數據輸入假定
缺點:計算複雜度高、空間複雜度高
使用數據範圍:數值型和標稱型
k-近鄰算法的工作原理:在訓練樣本集中,每個數據都存在標籤,即我們知道樣本集中每一數據與所屬分類的對應關係。輸入沒有標籤的新數據後,將新數據的每個特徵與樣本集中數據對應的特徵進行比較,然後算法提取樣本集中特徵最相似數據(最近鄰)的分類標籤。一般來說,我們只選擇樣本數據即中前k(通常k<20)個最相似的數據。最後選擇k個最相似數據中出現次數最多的分類,作爲新數據的分類。
k-近鄰算法的一般流程
1、收集數據:可以使用任何方法
2、準備數據:距離計算所需要的數值,最好是結構化的數據格式
3、分修數據:可以使用任何方法
4、訓練算法:此步驟不適用於k-近鄰算法
5、測試算法:計算錯誤率
6、使用算法:首先需要輸入樣本數據和結構化的輸出結果,然後運行k-近鄰算法判定輸入數據分別術語哪個分類,最後應用對計算出的分類執行後續的處理。
2.1.1 準備:使用Python導入數據
2.1.2 實施kNN算法
2.1.3 如何測試分類器
使用已知答案的數據。
2.2 示例:使用k-近鄰算法改進約會網站的配對效果
示例:在約會網站上使用k-近鄰算法
(1) 收集數據:提供文本文件。
(2) 準備數據:使用Python解析文本文件。
(3) 分析數據:使用Matplotlib畫二維擴散圖。
(4) 訓練算法:此步驟不適用於k-近鄰算法。
(5) 測試算法:使用海倫提供的部分數據作爲測試樣本。
測試樣本和非測試樣本的區別在於:測試樣本是已經完成分類的數據,如果預測分類與實際類別不同,則標記爲一個錯誤。
(6) 使用算法:產生簡單的命令行程序,然後海倫可以輸入一些特徵數據以判斷對方是否爲自己喜歡的類型。
2.2.1 準備數據:從文本文件中解析數據
在將特徵數據輸入到分類器之前,必須將待處理數據的格式改變爲分類器可以接受的格式。
Numpy數組和Python數組
由於NumPy庫提供的數組操作並不支持Python自帶的數組類型,因此在編寫代碼時要注意不要使用錯誤的數組類型。
2.2.2 分析數據:使用Matplotlib創建散點圖
具體可見Matplotlib簡明教程
import matplotlib
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2]
#或者 ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()
2.2.3 準備數據:歸一化數值
def autoNorm(dataSet):
minVals=dataSet.min(0)#對於dataSet這個矩陣返回每一列的最小值
maxVals=dataSet.max(0)
ranges=maxVals-minVals
normDataSet=zeros(shape(dataSet))
m=dataSet.shape[0]
normDataSet=dataSet-tile(minVals,(m,1))
normDataSet=normDataSet/tile(ranges,(m,1))
return normDataSet,ranges,minVals
2.2.4 測試算法:作爲完整程序驗證分類器
隨機選擇一些數據測試分類器。
def datingClassTest():
hoRatio=0.10
datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
normMat,ranges,minVals=autoNorm(datingDataMat)
m=normMat.shape[0]
numTestVecs=int(m*hoRatio)
errorCount=0.0
for i in range(numTestVecs):
classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
print "the classifier came back with %d, the real answer is: %d" %(classifierResult,datingLabels[i])
if (classifierResult!=datingLabels[i]): errorCount+=1.0
print "the total error rate is: %f"%(errorCount/float(numTestVecs))
2.2.5 使用算法:構建完整可用系統
def classifyPerson():
resultList=['not at all','in small doses','in large doses']
percentTats=float(raw_input("percentage of time spent playing video games?"))
ffMiles=float(raw_input(("frequent flier miles earned per year?")))
iceCream=float(raw_input("liters of ice cream consumed per year?"))
datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
normMat, ranges, minVals = autoNorm(datingDataMat)
inArr=array([ffMiles,percentTats,iceCream])
classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
print "You will probably like this person: ",resultList[classifierResult-1]
2.3 示例:手寫識別系統
識別數字0-9
2.3.1 準備數據:將圖像轉換爲測試向量
編寫img2vector,創建1*1024的NumPyt數組,然後打開指定文件,將文件存儲到NumPy數組中,返回數組。
def img2vector(filename):
returnVect=zeros((1,1024))
fr=open(filename)
for i in range(32):
lineStr=fr.readline()
for j in range(32):
returnVect[0,32*i+j]=int(lineStr[j])
return returnVect
2.3.2 測試算法:使用k-近鄰算法識別手寫數字
from os import listdir 從os模塊中導入函數listdir,列出給定目錄的文件名。
def handwritingClassTest():
hwLabels=[]
trainingFileList=listdir('trainingDigits')
m=len(trainingFileList)
trainingMat=zeros((m,1024))
for i in range(m):
fileNameStr=trainingFileList[i]
fileStr=fileNameStr.split('.')[0]
classNumStr=int(fileStr.split('_')[0])
hwLabels.append(classNumStr)
trainingMat[i,:]=img2vector('trainingDigits/%s'%fileNameStr)
testFileList=listdir('testDigits')
errorCount=0.0
mTest=len(testFileList)
for i in range(mTest):
fileNameStr=testFileList[i]
fileStr=fileNameStr.split('.')[0]
classNumStr=int(fileStr.split('_')[0])
vectorUnderTest=img2vector('testDigits/%s'%fileNameStr)
classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
print "the classifier came back with: %d, the real answer is: %d"% (classifierResult,classNumStr)
if (classifierResult!=classNumStr):errorCount+=1.0
print "\n the total number of errors is: %d"% errorCount
print "\n the total error rate is: %f"%(errorCount/float(mTest))
2.4 本章小結
k-近鄰算法是分類數據最簡單最有效的算法。k-近鄰算法是基於實力的學習,使用算法時我們必須有接近實際數據的訓練樣本數據。k-近鄰算法必須保存全部數據集,如果訓練數據集很大,必須使用大量的存儲空間。此外,由於必須對數據集中每個數據計算距離值,實際使用可能非常耗時。
k-近鄰算法的另一個缺陷是它無法給出任何數據的基礎結構信息,因此我們無法知曉平均實例樣本和典型實例樣本具有什麼特徵。概率測量方法可以解決該問題。
第 3 章 決策樹
k-近鄰算法可以完成很多分類任務,但最大的缺點在於無法給出數據的內在含義,決策樹的主要優勢就在於數據形式非常容易理解。
3.1 決策樹的構造
決策樹
優點:計算複雜度不高,輸出結果易於理解,對中間值的缺失不�%2