1. 程式人生 > >Python機器學習實戰kNN分類演算法

Python機器學習實戰kNN分類演算法

自學《機器學習實戰》一書,書中的程式碼親自敲一遍,努力搞懂每句程式碼的含義:

今天將第一章kNN分類演算法的筆記總結一下。

# -*- coding: utf-8 -*-

"""

k-近鄰演算法小結:
k-近鄰演算法是基於例項的學習,k-近鄰演算法必須儲存全部資料集,
如果訓練資料集很大,必須使用大量的儲存空間。
由於必須對資料集中的每個資料計算距離值,實際使用時可能非常耗時。

可修改的引數為:k,訓練集大小.

優點:簡單
缺點:耗時,計算量大,佔用儲存空間

注意:並非k越大越好,對於手寫數字識別系統的例子,k=3時,錯誤率為0.011628
                                      k=5時,錯誤率為0.017970

Annotation:<
[email protected]
> """ from numpy import * import os import operator import matplotlib import matplotlib.pyplot as plt # 建立資料集的函式 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 # k近鄰分類函式,使用歐氏距離公式 def classify0(inX,dataSet,labels,k): # 每行代表一條資料,計算資料集的大小 dataSetSize = dataSet.shape[0] # 將測試記錄複製n條,n為訓練集的數目,然後便於做距離運算 diffMat = tile(inX,(dataSetSize,1)) - dataSet # 計算距離平方 sqDiffmat = diffMat**2 # 計算距離平方和 sqDistances = sqDiffmat.sum(axis = 1) # 距離平方和開方 distances = sqDistances**0.5 # 按照距離從小到大的順序,返回訓練記錄的索引值 sortedDisIndices = distances.argsort() # 建立類別字典用來計數 classCount = {} # 取距離最小的前k項的標籤,標籤為鍵,個數為值,存入字典 for i in range(k): voteIlabel = labels[sortedDisIndices[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0)+1 # 對字典按照標籤出現的次數進行排序 sortedClassCount = sorted(classCount.iteritems(),\ key = operator.itemgetter(1),reverse = True) # 返回距離最小的前k項中,出現次數最多的標籤 return sortedClassCount[0][0] # 將訓練資料轉換為訓練樣本矩陣和類標籤向量 def file2matrix(filename): # 此處原文中未顯示關閉檔案,修改如下 with open(filename) as fr: arrayOLines = fr.readlines() # 訓練集條數 numberOfLines = len(arrayOLines) # 生成一個佔位零矩陣 returnMat = zeros((numberOfLines,3)) classLabelVector = [] index = 0 for line in arrayOLines: line = line.strip() listFormLine = line.split('\t') # 將每條記錄放入矩陣中,自動由字串轉換為數字 returnMat[index,:] = listFormLine[0:3] # 將訓練集的類別標籤放入列表中 classLabelVector.append(int(listFormLine[-1])) index += 1 return returnMat,classLabelVector # 歸一化特徵值,newValue = (oldValue-min)/(max-min) # 將任意取值範圍的特徵值轉化為0到1區間內的值 def autoNorm(dataSet): # 每一列的最小最大值 minVals = dataSet.min(0) 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 # 隨機挑選10%記錄作為測試集,其他作為訓練集進行分類測試,並計算錯誤率 def datingClassTest(): # 測試集比例為10% hoRatio = 0.10 datingSetMat,datingLabels = file2matrix('E:/mlcode/ch02/datingTestSet2.txt') normMat,ranges,minVals = autoNorm(datingSetMat) m = normMat.shape[0] numTestVecs = int(m*hoRatio) errorCount = 0.0 # 生成numTestVecs個隨機數,原文是挑選前numTestVecs個樣本作為測試資料 numList = [random.randint(0,m-1) for i in range(numTestVecs)] #for i in range(numTestVecs): for i in numList: classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m],\ datingLabels[numTestVecs:m],3) print "Record index: %d,The classifier came back with: %d, the real answer is: %d"\ % (i,classifierResult,datingLabels[i]) # 計算分類錯誤數目 if (classifierResult != datingLabels[i]):errorCount += 1.0 print "The total error rate is: %f" %(errorCount/float(numTestVecs)) # 根據輸入記錄進行預測 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('E:/mlcode/ch02/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] # 把一個32X32的二進位制影象矩陣轉換為1x1024的向量 def img2vector(filename): # 生成一個1X1024的佔位numpy向量 returnVector = zeros((1,1024)) # 原文未顯示關閉檔案,修改如下 with open(filename) as fr: l = fr.readlines() for i in range(32): lineStr = l[i] for j in range(32): returnVector[0,32*i+j] = int(lineStr[j]) # 返回1X1024的向量 return returnVector # 手寫數字識別系統的測試程式碼,每一條記錄(包括標籤)都進行數字化 def handwritingClassTest(): hwLabels = [] # 獲取指定目錄下的內容(檔案和資料夾) trainingFileList = os.listdir('E:/mlcode/ch02/trainingDigits') m = len(trainingFileList) # 生成訓練集佔位矩陣 trainingMat = zeros((m,1024)) # 將全部訓練集中的資料放入trainingMat中 for i in range(m): # 從檔名中解析分類數字 fileNameStr = trainingFileList[i] fileStr = fileNameStr.split('.')[0] classNumberStr = int(fileStr.split('_')[0]) hwLabels.append(classNumberStr) trainingMat[i,:] = img2vector('E:/mlcode/ch02/trainingDigits/%s' %fileNameStr) testFileList = os.listdir('E:/mlcode/ch02/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('E:/mlcode/ch02/testDigits/%s' %fileNameStr) classifierResult = classify0(vectorUnderTest,\ trainingMat,hwLabels,5) print "The classifier came back with: %d, the real answer is: %d"\ %(classifierResult,classNumStr) if (classifierResult != classNumStr):errorCount += 1.0 print "\nThe total number of errors is: %d." %errorCount print "\nThe total error rate is: %f" %(errorCount/float(mTest)) ##if __name__ == "__main__": ## group,labels = createDataSet() ## classify0([0,0],group,labels,3) ## datingDataMat,datingLabels = file2matrix('E:/mlcode/ch02/datingTestSet2.txt') ## # 使用matplotlib繪製原始資料的散點圖 ## fig = plt.figure() ## ax = fig.add_subplot(111) ## # 繪製第二列和第三列資料的散點圖 ## ax.scatter(datingDataMat[:,1],datingDataMat[:,2]) ## # 利用顏色及尺寸標識了資料點的屬性類別, ## # 第一個和第二個特徵能夠更好標識三個不同的樣本分類區域 ## ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array\ ## (datingLabels),15.0*array(datingLabels)) ## plt.show() ## normMat,ranges,minVals = autoNorm(datingDataMat) ## datingClassTest() ## classifyPerson() ## # 檢視trainingDigits中的檔案內容 ## with open('E:/mlcode/ch02/trainingDigits/0_0.txt') as f: ## l = f.readlines() ## testVector = img2vector('E:/mlcode/ch02/trainingDigits/0_13.txt') ## print testVector[0,0:32] ## print testVector[0,32:64] ## # 測試手寫數字識別系統 ## handwritingClassTest()

學習完之後自己寫了一個人臉識別的小例子,人臉識別單純靠畫素值資料探勘還是不夠的,下面的例子準確率不高只有60%左右,但還是幫助自己鞏固了kNN演算法。

# -*- coding: utf-8 -*-
"""
學習機器學習實戰的第一章kNN演算法後,自己寫一個人臉識別的小例子,效果不太好,準確率只有60%左右
我對人臉識別的演算法不瞭解,這裡只是使用一下kNN分類演算法,作為對所學知識的鞏固
這個例子從某圖片網站上獲取10位明星的圖片,每位明星500張,
然後呼叫openCV對圖片中的人臉進行識別,並生成灰度格式的面部圖片,對面部圖片進行過濾,
只保留尺寸大於50X50的面部圖片,然後將灰度格式的面部圖片全部壓縮為50X50的尺寸.
從每位明星的圖片中挑選10%的面部圖片作為測試集,其餘作為訓練集,使用kNN分類演算法,
進行分類測試.

主要思路就是把人臉圖片變為矩陣進而轉化為一維向量從而套用書上手寫數字識別的例子
"""
# Author:<
[email protected]
> import numpy as np import cv2,os,random,shutil from PIL import Image from kNN import * # 對原始圖片提取面部區域,並儲存 def detectFace(filename): list = os.listdir('./raw/%s' %filename) if not os.path.exists('./face/%s' %filename): os.mkdir('./face/%s' %filename) # 載入面部識別模型 face_cascade = cv2.CascadeClassifier('F:/opencv/build/etc/haarcascades/\ haarcascade_frontalface_default.xml') for item in list: img = cv2.imread('./raw/%s/%s' %(filename,item)) # 以灰度格式載入輸入影象 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 如果檢測到面部,它會返回面部所在的矩形區域Rect(x,y,w,h) face = face_cascade.detectMultiScale(gray, 1.3, 5) try: fc = gray[face[0][1]:(face[0][1]+face[0][3]),face[0][0]:(face[0][0]+face[0][2])] cv2.imwrite('./face/%s/%s' %(filename,item),fc) except: continue # 將面部影象統一儲存為50X50的jpg格式 def modifyImage(filename): list = os.listdir('./face/%s' %filename) if not os.path.exists('./temp/%s' %filename): os.mkdir('./temp/%s' %filename) for img in list: im = Image.open('./face/%s/%s' %(filename,img)) a,b = im.size if a>=50 and b>=50: im.thumbnail((50,50)) im.save('./temp/%s/%s.jpg' %(filename,img[:-4]),'jpeg') # 將影象轉化為1維向量 def imgTovector(filename): img = cv2.imread(filename) vector = img.flatten() return vector # 每個資料夾中隨機挑選百分之十圖片作為測試樣例,其餘作為訓練樣例 def randomSelectTest(): directoryList = os.listdir('./temp') for direc in directoryList: fileList = os.listdir('./temp/%s' %direc) # 資料夾中圖片總數 m = len(fileList) # 挑選百分之十的測試圖片 totalTest = int(m*0.1) testImg = [] while len(testImg) != totalTest: testImg = list(set([random.choice(fileList) for _ in range(totalTest)])) for img in testImg: shutil.copy('./temp/%s/%s' %(direc,img),'./test/%s' %img) trainList = list(set(fileList).difference(set(testImg))) # 將剩餘檔案作為訓練集 for img in trainList: shutil.copy('./temp/%s/%s' %(direc,img),'./train/%s' %img) # 圖片分類測試 def imgTest(): imgLabels = [] # 獲取指定目錄下的內容(檔案和資料夾) trainingFileList = os.listdir('./train') m = len(trainingFileList) # 生成訓練集佔位矩陣 trainingMat = zeros((m,7500)) # 將全部訓練集中的資料放入trainingMat中 for i in range(m): # 從檔名中解析分類數字 fileNameStr = trainingFileList[i] fileStr = fileNameStr.split('.')[0] classNumberStr = int(fileStr.split('_')[0]) imgLabels.append(classNumberStr) trainingMat[i,:] = imgTovector('./train/%s' %fileNameStr) testFileList = os.listdir('./test') errorCount = 0.0 mTest = len(testFileList) # 對測試集逐條進行測試 for i in range(mTest): fileNameStr = testFileList[i] fileStr = fileNameStr.split('.')[0] classNumStr = int(fileStr.split('_')[0]) vectorUnderTest = imgTovector('./test/%s' %fileNameStr) classifierResult = classify0(vectorUnderTest,\ trainingMat,imgLabels,3) print "The classifier came back with: %d, the real answer is: %d"\ %(classifierResult,classNumStr) if (classifierResult != classNumStr):errorCount += 1.0 print "\nThe total number of errors is: %d." %errorCount print "\nThe total error rate is: %f" %(errorCount/float(mTest)) if __name__ == '__main__': l = os.listdir('./raw') for item in l: detectFace(item) modifyImage(item) randomSelectTest() imgTest()


圖片spider程式碼就不附上了,很簡單的大家動手練習一下。

相關推薦

Python機器學習實戰kNN分類演算法

自學《機器學習實戰》一書,書中的程式碼親自敲一遍,努力搞懂每句程式碼的含義: 今天將第一章kNN分類演算法的筆記總結一下。 # -*- coding: utf-8 -*- """ k-近鄰演算法小結: k-近鄰演算法是基於例項的學習,k-近鄰演算法必須儲存全部資料集,

機器學習實戰----kNN近鄰演算法問題記錄

1.import kNN。報錯:only 2 non-keyword arguments accepted 原因:group =array([1.0,1.1],[1.0,1.0],[0,0],[0,0.1]) 粗心少寫了兩個中括號 正確寫法: group=array([

機器學習實戰——k-近鄰演算法Python實現問題記錄

  準備 kNN.py 的python模組 from numpy import * import operator def createDataSet(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

機器學習實戰——KNN演算法手寫數字識別

資料來源 我們的文字是形如這樣的,每個數字都有很多txt檔案,TXT裡面是01數字,表示手寫數字的灰度圖。 現在我們要用knn演算法實現數字識別。 資料處理 每個txt檔案都是32*32的0,1矩陣,如果要使用knn,那麼還得考慮行列關係,如果能把它拉開,只有一行,就可以不必考慮數字

機器學習實戰——KNN演算法改進約會網站配對效果

背景:         將約會網站的人分為三種類型:不喜歡的,魅力一般的,極具魅力的,分別用數字1,2,3表示,這些是樣本的標籤。樣本特徵為,每年飛行里程,玩視訊遊戲佔百分比,每週消費冰淇淋公升數。   &

機器學習實戰——KNN演算法預測電影型別

 預測電影型別     現有愛情片和動作片(不是愛情動作片,霧)的打鬥場面和接吻場面的次數統計,然後給出一個電影打鬥場面和接吻場面出現的次數,預測其型別。 那麼如何預測呢?當然用KNN了。     &

機器學習實戰k近鄰演算法(kNN)應用之手寫數字識別程式碼解讀

from numpy import * from os import listdir import operator import time #k-NN簡單實現函式 def classify0(inX,dataSet,labels,k): #求出樣本集的行數,也就是labels標籤的數目

機器學習實戰—k近鄰演算法(kNN)02-改進約會網站的配對效果

示例:使用k-近鄰演算法改進約會網站的配對效果 在約會網站上使用k-近鄰演算法: 1.收集資料:提供文字檔案。 2.準備資料:使用Python解析文字檔案。 3.分析資料:使用matplotlib畫二維擴散圖。 4.訓練演算法:此步驟不適用於k-近鄰演

機器學習實戰k-鄰近演算法(kNN)簡單實施程式碼解讀

一.概念 k-鄰近演算法是最簡單的機器學習演算法之一。 k-鄰近演算法採用測量不同特徵值之間的距離(具體說是歐氏距離)的方法進行分類。 輸入待分類的資料後,計算輸入特徵與樣本集資料對應特徵的距離,選擇樣本集中與輸入特徵距離最小的前k個樣本,統計這k個樣本資

機器學習實戰-KNN演算法實現及遇到的問題總結

最近在看《機器學習實戰》這本書,內容充實,重視實踐,很不錯,也很適合機器學習的入門。下面貼上用python編寫的KNN演算法程式碼,放在部落格裡安全啊~~我的電腦隨時都會崩潰的.... from numpy import * import operator from os

機器學習實戰--KNN 演算法 筆記

原始碼部分: from numpy import * import operatordef createDataSet():group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels=['A','A','B','B']ret

機器學習實戰-kNN:約會網站約友分類】python3實現-書本知識【2】

# coding=utf-8 # kNN-約會網站約友分類 from numpy import * import matplotlib.pyplot as plt import matplotlib.font_manager as font import operator # 【1】獲取資料 def in

SVM支援向量機-《機器學習實戰》SMO演算法Python實現(5)

經過前幾篇文章的學習,SVM的優化目標,SMO演算法的基本實現步驟,模型對應引數的選擇,我們已經都有了一定的理解,結合《機器學習實戰》,動手實踐一個基本的SVM支援向量機,來完成一個簡單的二分類任務。建立模型之前,首先看一下我們的資料,然後再用支援向量機實現分類:     

python機器學習實戰(三)

方法 baidu classes getter 全部 ken array數組 app 產生 python機器學習實戰(三) 版權聲明:本文為博主原創文章,轉載請指明轉載地址 www.cnblogs.com/fydeblog/p/7277205.html 前言 這篇博客是

python機器學習實戰(四)

畫畫 import 測試數據 trac 1+n read dex 缺失值 類型 python機器學習實戰(四) 版權聲明:本文為博主原創文章,轉載請指明轉載地址

分享《Python機器學習—預測分析核心演算法》高清中文版PDF+高清英文版PDF+原始碼

下載:https://pan.baidu.com/s/1sfaOZmuRj14FWNumGQ5ahw 更多資料分享:http://blog.51cto.com/3215120 《Python機器學習—預測分析核心演算法》高清中文版PDF+高清英文版PDF+原始碼高清中文版,338頁,帶目錄和書籤,文字能夠

Python機器學習——預測分析核心演算法 pdf 下載

機器學習關注於預測,其核心是一種基於數學和演算法的技術,要掌握該技術,需要對數學及統計概念有深入理解,能夠熟練使用R 語言或者其他程式語言。    本書通過集中介紹兩類可以進行有效預測的機器學習演算法,展示瞭如何使用Python 程式語言完成機器學習任務,從而降低機器學習難度,使機器

基於機器學習的文字分類演算法的研究

1. 簡述 文字分類的方法屬於有監督的學習方法,分類過程包括文字預處理、特徵抽取、降維、分類和模型評價。本文首先研究了文字分類的背景,中文分詞演算法。然後是對各種各樣的特徵抽取進行研究,包括詞項頻率-逆文件頻率和word2vec,降維方法有主成分分析法和潛在索引分析,最後是對分類演算法進行研究,

機器學習實戰——KNN學習筆記

K近鄰演算法 概述: K最近鄰(k-Nearest Neighbor,以下簡稱KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。

機器學習實戰KNN語法:dict.get() sorted() & itemgetter() tile() strip()&split() readlines&readline

1.dict.get() from numpy import * labels=['a','b','d','n','s'] dict={} a=labels[3]; b=labels[4]; dict[a]=dict.get(a,0)+1 dict[b]=dict.get(a,2)+1 prin