1. 程式人生 > >《機器學習實戰》第二章 2.2用k-近鄰演算法改進約會網站的配對效果

《機器學習實戰》第二章 2.2用k-近鄰演算法改進約會網站的配對效果

《機器學習實戰》系列部落格主要是實現並理解書中的程式碼,相當於讀書筆記了。畢竟實戰不能光看書。動手就能遇到許多奇奇怪怪的問題。博文比較粗糙,需結合書本。博主邊查邊學,水平有限,有問題的地方評論區請多指教。書中的程式碼和資料,網上有很多請自行下載。

KNN演算法的應用

2.2.1 從文字檔案中解析資料

函式的輸入為檔名字串,輸出為訓練樣本矩陣和類標籤向量。

解析程式

def file2matrix(filename):
    fr = open(filename)
    numberOfLines = len(fr.readlines())         #get the number of lines in the file
returnMat = zeros((numberOfLines,3)) #prepare matrix to return classLabelVector = [] #prepare labels return fr = open(filename) index = 0 for line in fr.readlines(): line = line.strip() listFromLine = line.split('\t') returnMat[index,:] = listFromLine[0
:3] #選前三列的資料存到矩陣中 classLabelVector.append(int(listFromLine[-1]))#最後一列轉成整數後存到標籤向量 index += 1 return returnMat,classLabelVector

匯入資料成功,檢查一下資料

>>> import kNN
>>> datingDataMat,datingLabels = kNN.file2matrix('datingTestSet2.txt')
>>> datingDataMat
array([[  4.09200000e+04,   8.32697600e+00,   9.53952000e-01],
       [  1.44880000e+04,   7.15346900e+00,   1.67390400e+00],
       [  2.60520000e+04,   1.44187100e+00,   8.05124000e-01],
       ..., 
       [  2.65750000e+04,   1.06501020e+01,   8.66627000e-01],
       [  4.81110000e+04,   9.13452800e+00,   7.28045000e-01],
       [  4.37570000e+04,   7.88260100e+00,   1.33244600e+00]]
) >>> datingLabels[0:20] [3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3]

相關函式學習

  • open 函式
    語法:open(name[, mode[, buffering]]) r:讀操作;w:寫操作;a:新增操作;b:二進位制存取操作 如果預設就是r

例如:在C:\Users\lzw\Desktop\python 目錄下新建一個txt檔案 test_open.txt

命令列輸入,就可以開啟這個檔案

>>> f=open('C:\\Users\\lzw\\Desktop\\python\\test_open.txt','r+')  # "\" 是轉義符,要將他再轉義
>>> 

如果是不加路徑,只有一個檔名:f = open (‘test_open.txt’) 則必須保證!!! test_open.txt儲存在我們的工作目錄中

寫檔案操作

>>> f = open('test_open.txt', 'w')
>>> f.write('hello,')
>>> f.write('python\n')
>>> f.write('this is a test\n')
>>> f.write('lzw\n')
>>> f.close()
>>> 

開啟 test_open.txt,可以看到原來空的txt 寫入了內容
這裡寫圖片描述

讀檔案操作

>>> f = open('test_open.txt')
>>> f.read(1)
'h'
>>> f.read(5)
'ello,'
>>> f.read()
'python\nthis is a test\nlzw\n'

readlines 逐行讀取

>>> f = open('test_open.txt')
>>> f.readlines()
['hello,python\n', 'this is a test\n', 'lzw\n']
>>> 
  • zeros 函式
>>> from numpy import*
>>> zeros(3)
array([ 0.,  0.,  0.])
>>> zeros((2,3))
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
>>> zeros([2,3])   #和上一種一樣
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
>>> zeros(3,int16)  #預設的是float型
array([0, 0, 0], dtype=int16)
>>> a=array([[2,3],[3,4]])
>>> zeros_like(a)    #返回和輸入大小相同,型別相同,用0填滿的陣列
array([[0, 0],
       [0, 0]])
  • strip 函式 刪除頭尾字串函式
>>> a = ' \n123\tabc\r'
>>> a.strip()  #刪除頭尾的字串,預設為空白符(包括'\n', '\r',  '\t',  ' ')
'123\tabc'
>>> a.lstrip() #刪除開頭 
'123\tabc\r'
>>> a.rstrip() #刪除結尾
' \n123\tabc'
>>> a.strip('12') 
' \n123\tabc\r'
>>> a = '12abc'
>>> a.strip('12')#刪除字串12
'abc'
>>> 

• split 函式拆分字串。通過指定分隔符對字串進行切片

>>> u = "www.doiido.com.cn"
>>> print u.split()  #使用預設分隔符
['www.doiido.com.cn']
>>> print u.split('.') #以"."為分隔符 
['www', 'doiido', 'com', 'cn']
>>> print u.split('.',1)  #分割一次
['www', 'doiido.com.cn']
>>> print u.split('.',2)  #分割兩次
['www', 'doiido', 'com.cn']
>>> print u.split('.',2)[1]  #分割兩次,並取序列為1的項
doiido
>>> u1,u2,u3 = u.split('.',2)#分割兩次,並把分割後的三個部分儲存到三個檔案
>>> print u1
www
>>> print u2
doiido
>>> print u3
com.cn

2.2.2使用Matplotlib畫散點圖

kNN .py 程式裡繼續寫,注意要import Matplotlib

散點圖程式

datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()

這裡寫圖片描述

相關函式學習

fig = plt.figure() #繪製一個figure物件

這裡寫圖片描述

ax = fig.add_subplot(223) #將畫布分割成2行2列,影象畫在從左到右從上到下的第3塊
這裡寫圖片描述

scatter 畫散點圖

2.2.3歸一化數值

newValue = (oldValue-min)/(max-min)

歸一化程式

def autoNorm(dataSet):
    minVals = dataSet.min(0)  #每一列最小值
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet)) #返回矩陣大小和資料矩陣一樣用0填充
    m = dataSet.shape[0]  #矩陣行數
    normDataSet = dataSet - tile(minVals, (m,1))
    normDataSet = normDataSet/tile(ranges, (m,1))   #element wise divide
    return normDataSet, ranges, minVals
>>> normMat
array([[ 0.44832535,  0.39805139,  0.56233353],
       [ 0.15873259,  0.34195467,  0.98724416],
       [ 0.28542943,  0.06892523,  0.47449629],
       ..., 
       [ 0.29115949,  0.50910294,  0.51079493],
       [ 0.52711097,  0.43665451,  0.4290048 ],
       [ 0.47940793,  0.3768091 ,  0.78571804]])
>>> ranges
array([  9.12730000e+04,   2.09193490e+01,   1.69436100e+00])
>>> minVals
array([ 0.      ,  0.      ,  0.001156])
>>> 

2.2.4測試演算法:用錯誤率來檢測分類器的效能

分離器效能測試程式

def datingClassTest():
    hoRatio = 0.10      #選擇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))
    print errorCount

這裡寫圖片描述

這裡寫圖片描述

2.2.5構建完整可用的系統

預測程式

def classifyPerson():
    resultList = ['不喜歡','魅力一般的人','極具魅力的人']
    percentTats = float(raw_input("percentgage of time spent playing video game ?"))
    ffMile = 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([ffMile,percentTats,iceCream])
    classifierResult = classify0((inArr - minVals)/ranges, normMat,datingLabels,3)
    print "You will probably like this person: ",resultList[classifierResult-1]
>>> reload(kNN)
<module 'kNN' from 'kNN.py'>
>>> kNN.classifyPerson()
percentgage of time spent playing video game ? 10
frequent flier miles earned per year ?10000
liters of ice Cream consumed per year ?0.5
You will probably like this person:  魅力一般的人
>>> 

相關函式學習

raw_input() 將所有輸入作為字串看待,返回字串型別

相關推薦

機器學習實戰第二 2.2k-近鄰演算法改進約會網站配對效果

《機器學習實戰》系列部落格主要是實現並理解書中的程式碼,相當於讀書筆記了。畢竟實戰不能光看書。動手就能遇到許多奇奇怪怪的問題。博文比較粗糙,需結合書本。博主邊查邊學,水平有限,有問題的地方評論區請多指教。書中的程式碼和資料,網上有很多請自行下載。 KNN演算法

機器學習實戰筆記2:使用K-近鄰演算法改進約會網站配對效果

一 背景 在學習了上一節簡單的k-近鄰演算法實現後,這一篇文章講一下書中給出的一個例子,在約會網站上使用k-近鄰演算法: 1)收集資料:可以使用爬蟲進行資料的收集,也可以使用第三方提供的免費或收費的資料。一般來講,資料放在txt文字檔案中,按照一定的格式進行

機器學習實戰第二篇)-k-近鄰演算法改進約會網站配對結果

    前面幾篇中,我們學習了機器學習演算法中k-近鄰演算法,本章我們將使用該演算法進行改進約會網站配對結果的工作。首先我們先進入背景介紹:      我的朋友海倫一直使用線上約會網站尋找適合自己的約會物件。儘管約會網站會推薦不同的人選,但她沒有從中找到喜歡的人。經過一番總

機器學習實戰》第2閱讀筆記3 使用K近鄰演算法改進約會網站配對效果—分步驟詳細講解1——資料準備:從文字檔案中解析資料(附詳細程式碼及註釋)

 本篇使用的資料存放在文字檔案datingTestSet2.txt中,每個樣本資料佔據一行,總共有1000行。 樣本主要包含以下3中特徵: (1)每年獲得飛行常客里程數 (2)玩視訊遊戲所耗時間百分比 (3)每週消費的冰淇淋公升數 在使用分類器之前,需要將處理的檔案格式

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

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

機器學習實戰之一】:C++實現K-近鄰演算法KNN

本文不對KNN演算法做過多的理論上的解釋,主要是針對問題,進行演算法的設計和程式碼的註解。 KNN演算法: 優點:精度高、對異常值不敏感、無資料輸入假定。 缺點:計算複雜度高、空間複雜度高。 適用資料範圍:數值型和標稱性。 工作原理:存在一個樣本資料集合,也稱作訓練樣本集,

機器學習—使用k-近鄰演算法改進約會網站配對效果

沒寫完先發出去,後面會修改QAQ python中zeros函式的用法 用於建立矩陣 將文字記錄轉化為numpy的解析程式 def file2matrix(filename): fr=open(filename) arrayOLines

使用k-近鄰演算法改進約會網站配對效果--學習筆記(python3版本)

本文取自《機器學習實戰》第二章,原始為python2實現,現將程式碼移植到python3,且原始程式碼非常整潔,所以這本書的程式碼很值得學習一下。 k-近鄰演算法概述 工作原理:存在一個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中

學習筆記:使用k-近鄰演算法改進約會網站配對效果

# name="code" class="python"># -*- coding: UTF-8 -*- from numpy import * import operator import matplotlib.pyplot as plt def file2mat

機器學習實戰第二----KNN

BE 指定 cto 文件轉換 .sh ati subplot OS umt tile的使用方法 tile(A,n)的功能是把A數組重復n次(可以在列方向,也可以在行方向) argsort()函數 argsort()函數返回的是數組中值從大到小的索引值 dict.get()

機器學習實戰-第二代碼+註釋-KNN

rep sdn odi als cti 元素 集合 pre recv #-*- coding:utf-8 -*- #https://blog.csdn.net/fenfenmiao/article/details/52165472 from numpy import *

機器學習實戰第二——學習KNN演算法,讀書筆記

        K近鄰演算法(簡稱KNN)學習是一種常用的監督學習方法,給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的k個訓練樣本,然後基於這k個“鄰居”的資訊來進行預測。通常在分類任務中可以使用“投票法”,即

機器學習實戰 第二KNN(1)python程式碼及註釋

#coding=utf8 #KNN.py from numpy import * import operator def createDataSet(): group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) #我覺

機器學習實戰第二記錄

第二章講的是K-鄰近演算法from numpy import*import operatordef createDataSet():    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels = ['A',

機器學習實戰筆記一:K-近鄰演算法約會網站上的應用

K-近鄰演算法概述 簡單的說,K-近鄰演算法採用不同特徵值之間的距離方法進行分類  K-近鄰演算法 優點:精度高、對異常值不敏感、無資料輸入假定。 缺點:計算複雜度高、空間複雜度高。 適用範圍:數值型和標稱型。   k-近鄰演算法的一般流程 收集資料:可使用任何方法

機器學習實戰之使用k-鄰近演算法改進約會網站配對效果

1 準備資料,從文字檔案中解析資料 用到的資料是機器學習實戰書中datingTextSet2.txt 程式碼如下: from numpy import * def file2matrix(filname): fr=open(filname) arrayOLines

Python3 機器學習實戰自我講解(二) K-近鄰法-海倫約會-手寫字型識別

第二章 k近鄰法 2.1 概念 2.1.1 k近鄰法簡介 k近鄰法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一種基本分類與迴歸方法。它的工作原理是:存在一個樣本資料集合,也稱作為訓練樣

機器學習實戰ByMatlab(四)二分K-means演算法

前面我們在是實現K-means演算法的時候,提到了它本身存在的缺陷: 1.可能收斂到區域性最小值 2.在大規模資料集上收斂較慢 對於上一篇博文最後說的,當陷入區域性最小值的時候,處理方法就是多執行幾次K-means演算法,然後選擇畸變函式J

機器學習實踐(七)—sklearn之K-近鄰演算法

一、K-近鄰演算法(KNN)原理 K Nearest Neighbor演算法又叫KNN演算法,這個演算法是機器學習裡面一個比較經典的演算法, 總體來說KNN演算法是相對比較容易理解的演算法 定義 如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的

2K-近鄰演算法約會網站預測

k-近鄰演算法概述 定義:簡單地說,k近鄰演算法採用測量不同特徵值之間的距離進行分類 原理:存在一個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資