天天看點

徒手寫代碼之《機器學習實戰》----KNN算法(1)

最近是忙炸了

抽空學習下《機器學習實戰》這本書裡的K近鄰算法,K近鄰還有另一個名字,叫懶惰算法。因為它壓根不用訓練模型,直接上例子就可以去預測。訓練過程=測試過程

原理:存在一個樣本資料集,也稱作訓練樣本集,并且樣本中每個資料都存在标簽,即我們知道樣本集中每一資料與所屬分類的對應關系,輸入沒有标簽的新資料後,将新資料的每個特征與樣本集中的資料對應的特征進行比較,然後算法提取樣本集中特征最相似的資料(最近鄰)的分類标簽。一般來說,我們隻選擇樣本集中前k個最相似的資料,這就是k-近鄰算法中k的出處,通常k是不大于20的整數,最後,選擇k個最相似的資料中出現次數最多的分類,作為新資料的分類。

優點:精度高,對異常資料不敏感(你的類别是由鄰居中的大多數決定的,一個異常鄰居并不能影響太大),無資料輸入假定;算法簡單,容易了解,無複雜機器學習算法。

缺點:計算複雜度高(需要計算新的資料點與樣本集中每個資料的“距離”,以判斷是否是前k個鄰居),空間複雜度高(巨大的矩陣)。

适用資料範圍:數值型和标稱型。

一、 先舉個K-NN四行兩列資料的小例子

二、 在約會網站上使用K近鄰算法

#導入numpy庫,operator
import numpy as np
import operator

#建立函數
def createDataSet():
    #四組二維特征
    group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    #四組特征的标簽如下
    labels = ['A','A','B','B']
    return group,labels
    
           
def classify0(inx,group,labels,k):
    #訓練資料集行數
    datasetSize = group.shape[0]
    #在行向量方向上重複inx共datasetSize次,在列向量方向上重複inx共1次
    diffMat = np.tile(inx,(datasetSize,1)) - group
    #二維特征相減去之後的平方
    sqDiffMat = diffMat**2
    #周遊所有行,相加
    sqDistances = sqDiffMat.sum(axis=1)
    #開方,計算出距離
    distances = sqDistances**0.5
    #傳回distances的索引值,後續sortedDistIndicies[i]要用到
    sortedDistIndicies = distances.argsort()
    #定義一個記錄類别次數的字典
    classCount={}
    for i in range(k):
        #周遊前k個,記錄次數
        votellabel = labels[sortedDistIndicies[i]]
        classCount[votellabel]= classCount.get(votellabel,0)+1
    #key=operator.itemgetter(1)根據字典的值進行排序
    #key=operator.itemgetter(0)根據字典的鍵進行排序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #傳回次數最多的類别,即所要分類的類别
    return sortedClassCount[0][0]
    

if __name__ == '__main__':
    #建立資料集
    group,labels = createDataSet()
    #測試集
    test=[0.5,1.1]
    test_class = classify0(test,group,labels,3)
    #列印分類結果
    print(test_class)
           
A
           

例子:在約會網站上使用K近鄰算法

1. 讀取檔案中的資料

2. 歸一化特征變量中的資料

3. K-NN分類器

4. 拿出所有資料集中10%的資料,用K-NN方法去分類

5. 通過約會網站的分類器,預測你是否喜歡某個人

# 1.讀取檔案中的資料
def file2matrix(filename):
    #打開檔案
    fr = open(filename)
    #讀取檔案所有内容
    arrayOfLines = fr.readlines()
    #得到檔案行數
    numberOfLines = len(arrayOfLines)
    #傳回numpy矩陣,numberOfLines行,3列的零元素矩陣
    returnMat = np.zeros((numberOfLines,3))
    #傳回分類的标簽向量
    classLabelVector = []
    #行的索引值
    index = 0
    for line in arrayOfLines:
        #删除空白字元
        line = line.strip()
        #将字元串根據“\t”分隔符進行分開切
        listFromLine = line.split('\t')
        #将資料前三列提取出來,存放到returnMat的numpy矩陣中,也就是不含标簽變量,隻有特征變量。
        #一行一行的存儲
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(listFromLine[-1])
        index += 1
    return returnMat,classLabelVector

returnMat,classLabelVector=file2matrix('datingTestSet.txt')      
print(returnMat)
print(classLabelVector)
print(returnMat.shape)

           
[[4.0920000e+04 8.3269760e+00 9.5395200e-01]
 [1.4488000e+04 7.1534690e+00 1.6739040e+00]
 [2.6052000e+04 1.4418710e+00 8.0512400e-01]
 ...
 [2.6575000e+04 1.0650102e+01 8.6662700e-01]
 [4.8111000e+04 9.1345280e+00 7.2804500e-01]
 [4.3757000e+04 7.8826010e+00 1.3324460e+00]]
['largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses']
(1000, 3)
           
# 2.歸一化特征變量中的資料
#歸一化公式為 :  newValue = (oldvalue-min)/(max-min)
def autoNorm(dataSet):
    #獲得資料的最小值和最大值
    minVals=dataSet.min(0)
    maxVals=dataSet.max(0)
    #最大值和最小值的範圍
    ranges = maxVals - minVals
    #建立numpy矩陣,裡面全是零元素
    normDataSet = np.zeros(np.shape(dataSet))
    #傳回dataSet的行數
    m = dataSet.shape[0]
    #原始值減去最小值
    normDataSet = dataSet - np.tile(minVals,(m,1))
    #除以最大和最小值的差,得到歸一化的資料
    normDataSet = normDataSet/np.tile(ranges,(m,1))
    return normDataSet,ranges,minVals

normDataSet,ranges,minVals=autoNorm(returnMat)
print(normDataSet)
print(ranges)
print(minVals)

           
[[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]]
[9.1273000e+04 2.0919349e+01 1.6943610e+00]
[0.       0.       0.001156]
           
#3.K-NN分類器
def classify0(inx,normDataSet,classLabelVector,k):
    #訓練資料集行數
    datasetSize =normDataSet.shape[0]
    #在行向量方向上重複inx共datasetSize次,在列向量方向上重複inx共1次
    diffMat = np.tile(inx,(datasetSize,1)) - normDataSet
    #二維特征相減去之後的平方
    sqDiffMat = diffMat**2
    #sum()所有元素相加,sum(0)列相加,sum(1)行相加
    sqDistances = sqDiffMat.sum(axis=1)
    #開方,計算出距離
    distances = sqDistances**0.5
    #傳回distances中元素從小到大排序後的索引值。後續sortedDistIndicies[i]要用到
    sortedDistIndicies = distances.argsort()
    #定義一個記錄類别次數的字典
    classCount={}
    for i in range(k):
        #周遊前k個,記錄次數
        votellabel =classLabelVector[sortedDistIndicies[i]]
        classCount[votellabel]= classCount.get(votellabel,0)+1
    #key=operator.itemgetter(1)根據字典的值進行排序
    #key=operator.itemgetter(0)根據字典的鍵進行排序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #傳回次數最多的類别,則所要分類的類别
    return sortedClassCount[0][0]


#4.拿出所有資料集中10%的資料,用K-NN方法去分類
def datingClassTest():
    #打開的檔案名
    filename = "datingTestSet.txt"
    #将傳回的特征矩陣和分類向量分别存儲到returnMat,classLabelVector
    returnMat,classLabelVector= file2matrix(filename)
    #取所有資料的百分之十
    hoRatio = 0.10
    #資料歸一化,傳回歸一化後的矩陣,資料範圍,資料最小值
    normDataSet, ranges, minVals = autoNorm(returnMat)
    #獲得normMat的行數
    m = normDataSet.shape[0]
    #百分之十的測試資料的個數
    numTestVecs = int(m * hoRatio)
    #分類錯誤計數
    errorCount = 0.0
    
    for i in range(numTestVecs):
        #前numTestVecs個資料作為測試集,後m-numTestVecs個資料作為訓練集
        classifierResult = classify0(normDataSet[i,:], normDataSet[numTestVecs:m,:],classLabelVector[numTestVecs:m], 3)
       
        print(classifierResult, classLabelVector[i])
        if classifierResult != classLabelVector[i]:
            errorCount += 1.0
    print("錯誤率:%f" %(errorCount/float(numTestVecs)))

datingClassTest()



           
largeDoses largeDoses
smallDoses smallDoses
didntLike didntLike
didntLike didntLike
didntLike didntLike
didntLike didntLike
largeDoses largeDoses
largeDoses largeDoses
didntLike didntLike
largeDoses largeDoses
didntLike didntLike
didntLike didntLike
smallDoses smallDoses
didntLike didntLike
didntLike didntLike
didntLike didntLike
didntLike didntLike
didntLike didntLike
smallDoses smallDoses
largeDoses largeDoses
smallDoses smallDoses
didntLike didntLike
largeDoses smallDoses
largeDoses largeDoses
smallDoses smallDoses
largeDoses largeDoses
smallDoses smallDoses
largeDoses largeDoses
smallDoses smallDoses
didntLike didntLike
largeDoses largeDoses
didntLike didntLike
largeDoses largeDoses
didntLike didntLike
smallDoses smallDoses
didntLike didntLike
didntLike didntLike
smallDoses smallDoses
largeDoses largeDoses
largeDoses largeDoses
didntLike didntLike
smallDoses smallDoses
largeDoses largeDoses
largeDoses largeDoses
largeDoses largeDoses
didntLike didntLike
didntLike didntLike
didntLike didntLike
didntLike didntLike
smallDoses smallDoses
smallDoses smallDoses
didntLike didntLike
largeDoses largeDoses
smallDoses smallDoses
smallDoses smallDoses
smallDoses smallDoses
smallDoses smallDoses
largeDoses largeDoses
didntLike didntLike
smallDoses smallDoses
didntLike didntLike
smallDoses smallDoses
smallDoses smallDoses
smallDoses smallDoses
smallDoses smallDoses
smallDoses smallDoses
largeDoses largeDoses
smallDoses smallDoses
largeDoses largeDoses
didntLike didntLike
smallDoses smallDoses
largeDoses largeDoses
smallDoses smallDoses
smallDoses smallDoses
largeDoses didntLike
largeDoses largeDoses
didntLike didntLike
didntLike didntLike
largeDoses largeDoses
largeDoses largeDoses
didntLike didntLike
smallDoses smallDoses
largeDoses largeDoses
largeDoses didntLike
largeDoses largeDoses
didntLike didntLike
smallDoses smallDoses
smallDoses smallDoses
didntLike didntLike
didntLike didntLike
largeDoses largeDoses
smallDoses largeDoses
didntLike didntLike
smallDoses smallDoses
didntLike didntLike
largeDoses largeDoses
largeDoses largeDoses
smallDoses smallDoses
didntLike didntLike
largeDoses didntLike
錯誤率:0.050000
           

5. 通過約會網站的分類器,預測你是否喜歡某個人

def classifyPerson():
    
    #三維特征使用者輸入
    precentTats = float(input("玩視訊遊戲所耗時間百分比:"))
    ffMiles = float(input("每年獲得的飛行常客裡程數:"))
    iceCream = float(input("每周消費的冰激淋公升數:"))
    #打開的檔案名
    filename = "datingTestSet.txt"
    #打開并處理資料
    returnMat,classLabelVector= file2matrix(filename)
    #取所有資料的百分之十
    hoRatio = 0.10
    #資料歸一化,傳回歸一化後的矩陣,資料範圍,資料最小值
    normDataSet, ranges, minVals = autoNorm(returnMat)
   
    #生成NumPy數組,測試集
    inArr = np.array([precentTats, ffMiles, iceCream])
    #測試集歸一化
    norminArr = (inArr - minVals) / ranges
    #傳回分類結果
    classifierResult = classify0(norminArr, normDataSet, classLabelVector, 3)
    #列印結果
    print("你可能%s這個人" % (classifierResult))

classifyPerson()
           
玩視訊遊戲所耗時間百分比:10
每年獲得的飛行常客裡程數:12
每周消費的冰激淋公升數:13
你可能smallDoses這個人
           

繼續閱讀