徒手寫代碼之《機器學習實戰》----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這個人
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章