日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习实战(二)——k-近邻算法

發(fā)布時(shí)間:2023/12/15 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习实战(二)——k-近邻算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

      • 2.1 k-近鄰算法概述
        • 2.1.1 準(zhǔn)備:使用python導(dǎo)入數(shù)據(jù)
        • 2.1.2 從文本文件中解析數(shù)據(jù)
      • 2.2 示例:使用k-近鄰算法改進(jìn)約會(huì)網(wǎng)站的配對效果
        • 2.2.1 準(zhǔn)備數(shù)據(jù):從文本文件中解析數(shù)據(jù)
        • 2.2.2 分析數(shù)據(jù):使用Matplotlib創(chuàng)建散點(diǎn)圖
        • 2.2.3 準(zhǔn)備數(shù)據(jù):歸一化數(shù)值
        • 2.2.4 測試算法:作為完整程序驗(yàn)證分類器
        • 2.2.5 使用算法:構(gòu)建完整可用系統(tǒng)
      • 2.3 手寫識別系統(tǒng)
        • 2.3.1 準(zhǔn)備數(shù)據(jù):將圖像轉(zhuǎn)化為測試向量
        • 2.3.2 使用sklearn實(shí)現(xiàn)手寫體識別
      • 2.4 KNN算法的優(yōu)缺點(diǎn)
        • 2.4.1 優(yōu)點(diǎn)
        • 2.4.2 缺點(diǎn):

2.1 k-近鄰算法概述

簡單的說,k-近鄰算法采用測量不同特征值之間的距離方法進(jìn)行分類

  • 優(yōu)點(diǎn):精度高、對異常值不敏感、無數(shù)據(jù)輸入假定
  • 缺點(diǎn):計(jì)算復(fù)雜度高、空間復(fù)雜度高
  • 適用數(shù)據(jù)范圍:數(shù)值型和標(biāo)稱型
  • 數(shù)值型:數(shù)值型目標(biāo)變量則可以從無限的數(shù)值集合中取值,如0.100,42.001等 (數(shù)值型目標(biāo)變量主要用于回歸分析)
  • 標(biāo)稱型: 標(biāo)稱型目標(biāo)變量的結(jié)果只在有限目標(biāo)集中取值,如真與假(標(biāo)稱型目標(biāo)變量主要用于分類)

k近鄰法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一種基本分類與回歸方法。它的工作原理是:存在一個(gè)樣本數(shù)據(jù)集合,也稱作為訓(xùn)練樣本集,并且樣本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽,即我們知道樣本集中每一個(gè)數(shù)據(jù)與所屬分類的對應(yīng)關(guān)系。輸入沒有標(biāo)簽的新數(shù)據(jù)后,將新的數(shù)據(jù)的每個(gè)特征與樣本集中數(shù)據(jù)對應(yīng)的特征進(jìn)行比較,然后算法提取樣本最相似數(shù)據(jù)(最近鄰)的分類標(biāo)簽。一般來說,我們只選擇樣本數(shù)據(jù)集中前k個(gè)最相似的數(shù)據(jù),這就是k-近鄰算法中k的出處,通常k是不大于20的整數(shù)。最后,選擇k個(gè)最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類,作為新數(shù)據(jù)的分類。

舉例:利用k-近鄰算法分類愛情片和動(dòng)作片
圖2-1顯示了5部動(dòng)作電影的打斗和接吻鏡頭個(gè)數(shù),假如有一部未看過的電影,可以使用KNN來確定其為愛情片還是動(dòng)作片。


圖中的?是該未知電影出現(xiàn)的鏡頭數(shù)圖形化展示,具體數(shù)字見表2-1

通過計(jì)算未知電影與樣本集中其他電影的距離,可以判斷其類型。


按照距離遞增排序,可以找到k個(gè)距離最近的電影,假設(shè)k=3,則距離最近的全是愛情片,可以判斷其為愛情片。

k-近鄰算法的一般流程:

  • 計(jì)算已知類別數(shù)據(jù)集中的點(diǎn)與當(dāng)前點(diǎn)之間的距離;
  • 按照距離遞增次序排序;
  • 選取與當(dāng)前點(diǎn)距離最小的k個(gè)點(diǎn);
  • 確定前k個(gè)點(diǎn)所在類別的出現(xiàn)頻率;
  • 返回前k個(gè)點(diǎn)所出現(xiàn)頻率最高的類別作為當(dāng)前點(diǎn)的預(yù)測分類。
  • 距離度量:

    2.1.1 準(zhǔn)備:使用python導(dǎo)入數(shù)據(jù)

    Machine Learning in Action Source Code

    from numpy import * import operator # 導(dǎo)入運(yùn)算符模塊# 創(chuàng)建數(shù)據(jù)集和標(biāo)簽的函數(shù) def createDataSet():group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])labels = ['A', 'A', 'B', 'B']return group, labelsif __name__ == '__main__':group, labels = createDataSet()print(group)print(labels)

    結(jié)果:

    [[ 1. 1.1][ 1. 1. ][ 0. 0. ][ 0. 0.1]] ['A', 'A', 'B', 'B']

    2.1.2 從文本文件中解析數(shù)據(jù)

    利用k-近鄰算法將每組數(shù)據(jù)劃分到某個(gè)類中,其偽代碼如下:

    對未知類別屬性的數(shù)據(jù)集中的每個(gè)點(diǎn)依次執(zhí)行以下操作:

  • 計(jì)算已知類別數(shù)據(jù)集中的點(diǎn)與當(dāng)前點(diǎn)之間的距離
  • 按照距離遞增次序排序
  • 選取與當(dāng)前點(diǎn)距離最小的k個(gè)點(diǎn)
  • 確定前k個(gè)點(diǎn)所在類別的出現(xiàn)頻率
  • 返回前k個(gè)點(diǎn)出現(xiàn)頻率最高類別作為當(dāng)前點(diǎn)的預(yù)測分類
  • import numpy as np import operator""" 函數(shù)說明:KNN算法,文本分類Parameters:inX:用于分類的數(shù)據(jù)(測試集)dataSet:用于訓(xùn)練的數(shù)據(jù)(訓(xùn)練集)labels:分類標(biāo)簽k:kNN算法參數(shù),選擇距離最小的k個(gè)點(diǎn)returns:分類結(jié)果modify:2018-03-08"""def classify0(inX,dataSet,labels,k):#numpy函數(shù)shape[0]返回dataSet行數(shù)dataSetSize=dataSet.shape[0]#在列向量方向上重復(fù)inX一次(橫向),在行向量方向上重復(fù)inX共dataSetSize次(縱向)#numpy.tile([0,0],(1,1))#在列方向上重復(fù)[0,0]1次,行1次 >>>array([[0, 0]])diffMat=np.tile(inX,(dataSetSize,1))-dataSet#二維特征相減后平方sqDiffMat=diffMat**2#sum()所有元素相加,sum(0)列相加,sum(1)行相加sqDistances=sqDiffMat.sum(axis=1)#開方,計(jì)算出距離distances=sqDistances**0.5#返回distances中元素從小到大排序后的索引值sortedDistIndices=distances.argsort()#定一個(gè)記錄類別次數(shù)的字典classCount={}for i in range(k):#取出前k個(gè)元素的類別voteIlabel=labels[sortedDistIndices[i]]#計(jì)算類別次數(shù)# dict.get(key,default=None),字典的get()方法,返回指定鍵的值,如果值不在字典中返回默認(rèn)值。classCount[voteIlabel]=classCount.get(voteIlabel,0)+1#key=operator.items(1)根據(jù)字典的值進(jìn)行排序#key=operator.items(0)根據(jù)字典的鍵值進(jìn)行排序#reverse降序排序字典sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#返回次數(shù)最多的類別,即所要分類的類別return sortedClassCount[0][0]

    其中,標(biāo)簽向量的元素?cái)?shù)目和矩陣dataSet行數(shù)相同,上述程序中使用歐氏距離公式,計(jì)算兩個(gè)向量點(diǎn)之間的距離。
    d=(xA0?xB0)2+(xA1?xB1)2d=\sqrt{(xA_0-xB_0)^2+(xA_1-xB_1)^2}d=(xA0??xB0?)2+(xA1??xB1?)2?

    整體程序示例:

    import numpy as np import operator""" 函數(shù)說明:KNN算法,文本分類Parameters:inX:用于分類的數(shù)據(jù)(測試集)dataSet:用于訓(xùn)練的數(shù)據(jù)(訓(xùn)練集)labels:分類標(biāo)簽k:kNN算法參數(shù),選擇距離最小的k個(gè)點(diǎn)returns:分類結(jié)果modify:2018-03-08""" def createDataSet():group = np.array([[1, 101], [5, 89], [108, 0], [108, 5]])labels = ['愛情片','愛情片', '動(dòng)作片', '動(dòng)作片']return group, labelsdef classify0(inX,dataSet,labels,k):#numpy函數(shù)shape[0]返回dataSet行數(shù)dataSetSize=dataSet.shape[0]#在列向量方向上重復(fù)inX一次(橫向),在行向量方向上重復(fù)inX共dataSetSize次(縱向)#numpy.tile([0,0],(1,1))#在列方向上重復(fù)[0,0]1次,行1次 >>>array([[0, 0]])diffMat=np.tile(inX,(dataSetSize,1))-dataSet#二維特征相減后平方sqDiffMat=diffMat**2#sum()所有元素相加,sum(0)列相加,sum(1)行相加sqDistances=sqDiffMat.sum(axis=1)#開方,計(jì)算出距離distances=sqDistances**0.5#返回distances中元素從小到大排序后的索引值sortedDistIndices=distances.argsort()#定一個(gè)記錄類別次數(shù)的字典classCount={}for i in range(k):#取出前k個(gè)元素的類別voteIlabel=labels[sortedDistIndices[i]]#計(jì)算類別次數(shù)# dict.get(key,default=None),字典的get()方法,返回指定鍵的值,如果值不在字典中返回默認(rèn)值。classCount[voteIlabel]=classCount.get(voteIlabel,0)+1#key=operator.items(1)根據(jù)字典的值進(jìn)行排序#key=operator.items(0)根據(jù)字典的鍵值進(jìn)行排序#reverse降序排序字典sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#返回次數(shù)最多的類別,即所要分類的類別return sortedClassCount[0][0]if __name__ == '__main__':#創(chuàng)建數(shù)據(jù)集group, labels = createDataSet()#測試集test = [101,20]#kNN分類test_class = classify0(test, group, labels, 3)#打印分類結(jié)果print(test_class)

    輸出:

    動(dòng)作片

    看到這里,有人可能會(huì)問:“分類器何種情況下會(huì)出錯(cuò)?”或者“答案是否總是正確的?”答案是否定的.

    分類器并不會(huì)得到百分百正確的結(jié)果,我們可以使用多種方法檢測分類器的正確率。此外分類器的性能也會(huì)受到多種因素的影響,如分類器設(shè)置和數(shù)據(jù)集等。不同的算法在不同數(shù)據(jù)集上的表現(xiàn)可能完全不同。

    為了測試分類器的效果,我們可以使用已知答案的數(shù)據(jù),當(dāng)然答案不能告訴分類器,檢驗(yàn)分類器給出的結(jié)果是否符合預(yù)期結(jié)果。通過大量的測試數(shù)據(jù),我們可以得到分類器的錯(cuò)誤率-分類器給出錯(cuò)誤結(jié)果的次數(shù)除以測試執(zhí)行的總數(shù)。

    錯(cuò)誤率是常用的評估方法,主要用于評估分類器在某個(gè)數(shù)據(jù)集上的執(zhí)行效果。完美分類器的錯(cuò)誤率為0,最差分類器的錯(cuò)誤率是1.0。同時(shí),我們也不難發(fā)現(xiàn),k-近鄰算法沒有進(jìn)行數(shù)據(jù)的訓(xùn)練,直接使用未知的數(shù)據(jù)與已知的數(shù)據(jù)進(jìn)行比較,得到結(jié)果。因此,可以說k-鄰近算法不具有顯式的學(xué)習(xí)過程。

    2.2 示例:使用k-近鄰算法改進(jìn)約會(huì)網(wǎng)站的配對效果

    步驟:

  • 收集數(shù)據(jù):提供文本文件
  • 準(zhǔn)備數(shù)據(jù):使用python解析文本文件
  • 分析數(shù)據(jù):使用Matplotlib畫二維擴(kuò)散圖
  • 訓(xùn)練算法:此步驟不適合于k-近鄰算法
  • 測試算法:使用海倫提供的部分?jǐn)?shù)據(jù)作為測試樣本
    測試樣本和非測試樣本的區(qū)別在于:測試樣本是完成分類的數(shù)據(jù),如果預(yù)測分類與實(shí)際類別不同,則標(biāo)記為一個(gè)錯(cuò)誤
  • 使用算法:產(chǎn)生簡單的命令行程序,然后海倫可以輸入一些特征數(shù)據(jù)以判斷對方是否為自己喜歡的類型
  • 2.2.1 準(zhǔn)備數(shù)據(jù):從文本文件中解析數(shù)據(jù)

    每個(gè)樣本數(shù)據(jù)占一行,共1000行,存儲(chǔ)在datingTestSet.txt中,樣本包含三種特征:

    • 每年獲得的飛行常客里程數(shù)
    • 玩游戲所耗時(shí)間百分比
    • 每周消費(fèi)的冰淇淋公升數(shù)

    將上述特征數(shù)據(jù)輸入到分類器之前,必須將待處理數(shù)據(jù)的格式改變?yōu)榉诸惼骺山邮艿母袷?#xff0c;在KNN.py中創(chuàng)建名為file2matrix的函數(shù),以此來處理輸入格式問題,輸入為文件名字符串,輸出為訓(xùn)練樣本矩陣和類標(biāo)簽向量。

    import numpy as np""" 函數(shù)說明:打開解析文件,對數(shù)據(jù)進(jìn)行分類,1——喜歡,2——魅力一般,3——極具魅力Parameters:filename:文件名Returns:returnMat:特征矩陣classLabelVector:分類label向量Modify:2018-03-08"""def file2matrix(filename):# 打開文件fr = open(filename)# 讀取文件所有內(nèi)容arrayOLines = fr.readlines()# 得到文件行數(shù)numberOfLines = len(arrayOLines)# 返回的numpy矩陣,解析完成的數(shù)據(jù):numberOfLines行,3列returnMat = np.zeros((numberOfLines, 3))# 返回的分類標(biāo)簽向量classLabelVector = []# 行索引值index = 0for line in arrayOLines:# s.strip(rm),當(dāng)rm為空時(shí),默認(rèn)刪除空白符(包括'\n','\t','\r','')line = line.strip()# 使用s.split(str="",num=string,cout(str))將字符串根據(jù)'\t'分隔符進(jìn)行切片listFromLine = line.split('\t')# 將數(shù)據(jù)前三列提取出來,存放到returnMat的numpy矩陣中,也就是特征矩陣returnMat[index, :] = listFromLine[0:3]# 根據(jù)文本中標(biāo)記的喜歡程度進(jìn)行分類,1代表不喜歡,2代表一般,3代表極具魅力if listFromLine[-1] == 'didntLike':classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':classLabelVector.append(3)index += 1return returnMat, classLabelVector""" 函數(shù)說明:main函數(shù)Parameters:無 Returns:無 Modify:2018-03-08 """ if __name__=='__main__':# 打開的文件名filename = "datingTestSet.txt"# 打開并處理數(shù)據(jù)datingDataMat, datingLabels = file2matrix(filename)print(datingDataMat)print(datingLabels)

    結(jié)果:

    上面的矩陣是特征矩陣,下面的向量是標(biāo)簽向量。

    可以看到,我們已經(jīng)順利導(dǎo)入數(shù)據(jù),并對數(shù)據(jù)進(jìn)行解析,格式化為分類器需要的數(shù)據(jù)格式。接著我們需要了解數(shù)據(jù)的真正含義。可以通過友好、直觀的圖形化的方式觀察數(shù)據(jù)。

    2.2.2 分析數(shù)據(jù):使用Matplotlib創(chuàng)建散點(diǎn)圖

    from matplotlib.font_manager import FontProperties import matplotlib.lines as mlines import matplotlib.pyplot as plt import numpy as np""" 函數(shù)說明:打開并解析文件,對數(shù)據(jù)進(jìn)行分類:1代表不喜歡,2代表魅力一般,3代表極具魅力Parameters:filename - 文件名 Returns:returnMat - 特征矩陣classLabelVector - 分類Label向量Modify:2017-03-09 """ def file2matrix(filename):#打開文件fr = open(filename)#讀取文件所有內(nèi)容arrayOLines = fr.readlines()#得到文件行數(shù)numberOfLines = len(arrayOLines)#返回的NumPy矩陣,解析完成的數(shù)據(jù):numberOfLines行,3列returnMat = np.zeros((numberOfLines,3))#返回的分類標(biāo)簽向量classLabelVector = []#行的索引值index = 0for line in arrayOLines:#s.strip(rm),當(dāng)rm空時(shí),默認(rèn)刪除空白符(包括'\n','\r','\t',' ')line = line.strip()#使用s.split(str="",num=string,cout(str))將字符串根據(jù)'\t'分隔符進(jìn)行切片。listFromLine = line.split('\t')#將數(shù)據(jù)前三列提取出來,存放到returnMat的NumPy矩陣中,也就是特征矩陣returnMat[index,:] = listFromLine[0:3]#根據(jù)文本中標(biāo)記的喜歡的程度進(jìn)行分類,1代表不喜歡,2代表魅力一般,3代表極具魅力if listFromLine[-1] == 'didntLike':classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':classLabelVector.append(3)index += 1return returnMat, classLabelVector""" 函數(shù)說明:可視化數(shù)據(jù)Parameters:datingDataMat:特征矩陣datingLabels:分類Label Returns:無 Modify:2018-03-09 """ def showdatas(datingDataMat, datingLabels):#設(shè)置漢字格式font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)#將fig畫布分隔成1行1列,不共享x軸和y軸,fig畫布的大小為(13,8)#當(dāng)nrow=2,nclos=2時(shí),代表fig畫布被分為四個(gè)區(qū)域,axs[0][0]表示第一行第一個(gè)區(qū)域fig, axs = plt.subplots(nrows=2, ncols=2,sharex=False, sharey=False, figsize=(13,8))numberOfLabels = len(datingLabels)LabelsColors = []for i in datingLabels:if i == 1:LabelsColors.append('black')if i == 2:LabelsColors.append('orange')if i == 3:LabelsColors.append('red')#畫出散點(diǎn)圖,以datingDataMat矩陣的第一(飛行常客例程)、第二列(玩游戲)數(shù)據(jù)畫散點(diǎn)數(shù)據(jù),散點(diǎn)大小為15,透明度為0.5axs[0][0].scatter(x=datingDataMat[:,0], y=datingDataMat[:,1], color=LabelsColors,s=15, alpha=.5)#設(shè)置標(biāo)題,x軸label,y軸labelaxs0_title_text = axs[0][0].set_title(u'每年獲得的飛行常客里程數(shù)與玩視頻游戲所消耗時(shí)間占比',FontProperties=font)axs0_xlabel_text = axs[0][0].set_xlabel(u'每年獲得的飛行常客里程數(shù)',FontProperties=font)axs0_ylabel_text = axs[0][0].set_ylabel(u'玩視頻游戲所消耗時(shí)間占',FontProperties=font)plt.setp(axs0_title_text, size=9, weight='bold', color='red')plt.setp(axs0_xlabel_text, size=7, weight='bold', color='black')plt.setp(axs0_ylabel_text, size=7, weight='bold', color='black')#畫出散點(diǎn)圖,以datingDataMat矩陣的第一(飛行常客例程)、第三列(冰激凌)數(shù)據(jù)畫散點(diǎn)數(shù)據(jù),散點(diǎn)大小為15,透明度為0.5axs[0][1].scatter(x=datingDataMat[:,0], y=datingDataMat[:,2], color=LabelsColors,s=15, alpha=.5)#設(shè)置標(biāo)題,x軸label,y軸labelaxs1_title_text = axs[0][1].set_title(u'每年獲得的飛行常客里程數(shù)與每周消費(fèi)的冰激淋公升數(shù)',FontProperties=font)axs1_xlabel_text = axs[0][1].set_xlabel(u'每年獲得的飛行常客里程數(shù)',FontProperties=font)axs1_ylabel_text = axs[0][1].set_ylabel(u'每周消費(fèi)的冰激淋公升數(shù)',FontProperties=font)plt.setp(axs1_title_text, size=9, weight='bold', color='red')plt.setp(axs1_xlabel_text, size=7, weight='bold', color='black')plt.setp(axs1_ylabel_text, size=7, weight='bold', color='black')#畫出散點(diǎn)圖,以datingDataMat矩陣的第二(玩游戲)、第三列(冰激凌)數(shù)據(jù)畫散點(diǎn)數(shù)據(jù),散點(diǎn)大小為15,透明度為0.5axs[1][0].scatter(x=datingDataMat[:,1], y=datingDataMat[:,2], color=LabelsColors,s=15, alpha=.5)#設(shè)置標(biāo)題,x軸label,y軸labelaxs2_title_text = axs[1][0].set_title(u'玩視頻游戲所消耗時(shí)間占比與每周消費(fèi)的冰激淋公升數(shù)',FontProperties=font)axs2_xlabel_text = axs[1][0].set_xlabel(u'玩視頻游戲所消耗時(shí)間占比',FontProperties=font)axs2_ylabel_text = axs[1][0].set_ylabel(u'每周消費(fèi)的冰激淋公升數(shù)',FontProperties=font)plt.setp(axs2_title_text, size=9, weight='bold', color='red')plt.setp(axs2_xlabel_text, size=7, weight='bold', color='black')plt.setp(axs2_ylabel_text, size=7, weight='bold', color='black')#設(shè)置圖例didntLike = mlines.Line2D([], [], color='black', marker='.',markersize=6, label='didntLike')smallDoses = mlines.Line2D([], [], color='orange', marker='.',markersize=6, label='smallDoses')largeDoses = mlines.Line2D([], [], color='red', marker='.',markersize=6, label='largeDoses')#添加圖例axs[0][0].legend(handles=[didntLike,smallDoses,largeDoses])axs[0][1].legend(handles=[didntLike,smallDoses,largeDoses])axs[1][0].legend(handles=[didntLike,smallDoses,largeDoses])#顯示圖片plt.show()""" 函數(shù)說明:main函數(shù)Parameters:無 Returns:無Modify:2018-03-09 """ if __name__ == '__main__':#打開的文件名filename = "datingTestSet.txt"#打開并處理數(shù)據(jù)datingDataMat, datingLabels = file2matrix(filename)showdatas(datingDataMat, datingLabels)

    2.2.3 準(zhǔn)備數(shù)據(jù):歸一化數(shù)值

    表2-3給出了提取的四組數(shù)據(jù),如果想要計(jì)算樣本3和4之間的距離,可以使用下面的方法:
    (0?67)2+(20000?32000)2+(1.1?0.1)2\sqrt{(0-67)^2+(20000-32000)^2+(1.1-0.1)^2}(0?67)2+(20000?32000)2+(1.1?0.1)2?


    但是式中差值最大的屬性對計(jì)算結(jié)果的影響最大,也就是該特征對結(jié)果的影響遠(yuǎn)遠(yuǎn)超過了其他的兩種,所以要使用一種方法使得該三種特征同等重要,所以采用歸一化的方式來處理。

    • 歸一化 newValue=(oldValue-min)/(max-min)
      其中min和max分別是數(shù)據(jù)集中的最小特征值和最大特征值。雖然改變數(shù)值取值范圍增加了分類器的復(fù)雜度,但為了得到準(zhǔn)確結(jié)果,我們必須這樣做。在kNN_test2.py文件中編寫名為autoNorm的函數(shù),用該函數(shù)自動(dòng)將數(shù)據(jù)歸一化。代碼如下:
    import numpy as np""" 函數(shù)說明:打開并解析文件,對數(shù)據(jù)進(jìn)行分類:1代表不喜歡,2代表魅力一般,3代表極具魅力Parameters:filename - 文件名 Returns:returnMat - 特征矩陣classLabelVector - 分類Label向量Modify:2018-03-09 """ def file2matrix(filename):#打開文件fr = open(filename)#讀取文件所有內(nèi)容arrayOLines = fr.readlines()#得到文件行數(shù)numberOfLines = len(arrayOLines)#返回的NumPy矩陣,解析完成的數(shù)據(jù):numberOfLines行,3列returnMat = np.zeros((numberOfLines,3))#返回的分類標(biāo)簽向量classLabelVector = []#行的索引值index = 0for line in arrayOLines:#s.strip(rm),當(dāng)rm空時(shí),默認(rèn)刪除空白符(包括'\n','\r','\t',' ')line = line.strip()#使用s.split(str="",num=string,cout(str))將字符串根據(jù)'\t'分隔符進(jìn)行切片。listFromLine = line.split('\t')#將數(shù)據(jù)前三列提取出來,存放到returnMat的NumPy矩陣中,也就是特征矩陣returnMat[index,:] = listFromLine[0:3]#根據(jù)文本中標(biāo)記的喜歡的程度進(jìn)行分類,1代表不喜歡,2代表魅力一般,3代表極具魅力if listFromLine[-1] == 'didntLike':classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':classLabelVector.append(3)index += 1return returnMat, classLabelVector""" 函數(shù)說明:對數(shù)據(jù)進(jìn)行歸一化Parameters:dataSet - 特征矩陣 Returns:normDataSet - 歸一化后的特征矩陣ranges - 數(shù)據(jù)范圍minVals - 數(shù)據(jù)最小值Modify:2018-03-09 """ def autoNorm(dataSet):#獲得數(shù)據(jù)的最小值minVals = dataSet.min(0)maxVals = dataSet.max(0)#最大值和最小值的范圍ranges = maxVals - minVals#shape(dataSet)返回dataSet的矩陣行列數(shù)normDataSet = np.zeros(np.shape(dataSet))#返回dataSet的行數(shù)m = dataSet.shape[0]#原始值減去最小值normDataSet = dataSet - np.tile(minVals, (m, 1))#除以最大和最小值的差,得到歸一化數(shù)據(jù)normDataSet = normDataSet / np.tile(ranges, (m, 1))#返回歸一化數(shù)據(jù)結(jié)果,數(shù)據(jù)范圍,最小值return normDataSet, ranges, minVals""" 函數(shù)說明:main函數(shù)Parameters:無 Returns:無Modify:2018-03-09 """ if __name__ == '__main__':#打開的文件名filename = "datingTestSet.txt"#打開并處理數(shù)據(jù)datingDataMat, datingLabels = file2matrix(filename)normDataSet, ranges, minVals = autoNorm(datingDataMat)print(normDataSet)print(ranges)print(minVals)

    2.2.4 測試算法:作為完整程序驗(yàn)證分類器

    機(jī)器學(xué)習(xí)算法一個(gè)很重要的工作就是評估算法的正確率,通常我們只提供已有數(shù)據(jù)的90%作為訓(xùn)練樣本來訓(xùn)練分類器,而使用其余的10%數(shù)據(jù)去測試分類器,檢測分類器的正確率。需要注意的是,10%的測試數(shù)據(jù)應(yīng)該是隨機(jī)選擇的,由于海倫提供的數(shù)據(jù)并沒有按照特定目的來排序,所以我么你可以隨意選擇10%數(shù)據(jù)而不影響其隨機(jī)性。
    為了測試分類器效果,在kNN_test2.py文件中創(chuàng)建函數(shù)datingClassTest,編寫代碼如下:

    import numpy as np import operator""" 函數(shù)說明:kNN算法,分類器Parameters:inX - 用于分類的數(shù)據(jù)(測試集)dataSet - 用于訓(xùn)練的數(shù)據(jù)(訓(xùn)練集)labes - 分類標(biāo)簽k - kNN算法參數(shù),選擇距離最小的k個(gè)點(diǎn) Returns:sortedClassCount[0][0] - 分類結(jié)果Modify:2018-03-09 """ def classify0(inX, dataSet, labels, k):#numpy函數(shù)shape[0]返回dataSet的行數(shù)dataSetSize = dataSet.shape[0]#在列向量方向上重復(fù)inX共1次(橫向),行向量方向上重復(fù)inX共dataSetSize次(縱向)diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet#二維特征相減后平方sqDiffMat = diffMat**2#sum()所有元素相加,sum(0)列相加,sum(1)行相加sqDistances = sqDiffMat.sum(axis=1)#開方,計(jì)算出距離distances = sqDistances**0.5#返回distances中元素從小到大排序后的索引值sortedDistIndices = distances.argsort()#定一個(gè)記錄類別次數(shù)的字典classCount = {}for i in range(k):#取出前k個(gè)元素的類別voteIlabel = labels[sortedDistIndices[i]]#dict.get(key,default=None),字典的get()方法,返回指定鍵的值,如果值不在字典中返回默認(rèn)值。#計(jì)算類別次數(shù)classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#python3中用items()替換python2中的iteritems()#key=operator.itemgetter(1)根據(jù)字典的值進(jìn)行排序#key=operator.itemgetter(0)根據(jù)字典的鍵進(jìn)行排序#reverse降序排序字典sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#返回次數(shù)最多的類別,即所要分類的類別return sortedClassCount[0][0]""" 函數(shù)說明:打開并解析文件,對數(shù)據(jù)進(jìn)行分類:1代表不喜歡,2代表魅力一般,3代表極具魅力Parameters:filename - 文件名 Returns:returnMat - 特征矩陣classLabelVector - 分類Label向量Modify:2018-03-09 """ def file2matrix(filename):#打開文件fr = open(filename)#讀取文件所有內(nèi)容arrayOLines = fr.readlines()#得到文件行數(shù)numberOfLines = len(arrayOLines)#返回的NumPy矩陣,解析完成的數(shù)據(jù):numberOfLines行,3列returnMat = np.zeros((numberOfLines,3))#返回的分類標(biāo)簽向量classLabelVector = []#行的索引值index = 0for line in arrayOLines:#s.strip(rm),當(dāng)rm空時(shí),默認(rèn)刪除空白符(包括'\n','\r','\t',' ')line = line.strip()#使用s.split(str="",num=string,cout(str))將字符串根據(jù)'\t'分隔符進(jìn)行切片。listFromLine = line.split('\t')#將數(shù)據(jù)前三列提取出來,存放到returnMat的NumPy矩陣中,也就是特征矩陣returnMat[index,:] = listFromLine[0:3]#根據(jù)文本中標(biāo)記的喜歡的程度進(jìn)行分類,1代表不喜歡,2代表魅力一般,3代表極具魅力if listFromLine[-1] == 'didntLike':classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':classLabelVector.append(3)index += 1return returnMat, classLabelVector""" 函數(shù)說明:對數(shù)據(jù)進(jìn)行歸一化Parameters:dataSet - 特征矩陣 Returns:normDataSet - 歸一化后的特征矩陣ranges - 數(shù)據(jù)范圍minVals - 數(shù)據(jù)最小值Modify:2018-03-09 """ def autoNorm(dataSet):#獲得數(shù)據(jù)的最小值minVals = dataSet.min(0)maxVals = dataSet.max(0)#最大值和最小值的范圍ranges = maxVals - minVals#shape(dataSet)返回dataSet的矩陣行列數(shù)normDataSet = np.zeros(np.shape(dataSet))#返回dataSet的行數(shù)m = dataSet.shape[0]#原始值減去最小值normDataSet = dataSet - np.tile(minVals, (m, 1))#除以最大和最小值的差,得到歸一化數(shù)據(jù)normDataSet = normDataSet / np.tile(ranges, (m, 1))#返回歸一化數(shù)據(jù)結(jié)果,數(shù)據(jù)范圍,最小值return normDataSet, ranges, minVals""" 函數(shù)說明:分類器測試函數(shù)Parameters:無 Returns:normDataSet - 歸一化后的特征矩陣ranges - 數(shù)據(jù)范圍minVals - 數(shù)據(jù)最小值Modify:2018-03-09 """ def datingClassTest():#打開的文件名filename = "datingTestSet.txt"#將返回的特征矩陣和分類向量分別存儲(chǔ)到datingDataMat和datingLabels中datingDataMat, datingLabels = file2matrix(filename)#取所有數(shù)據(jù)的百分之十hoRatio = 0.10#數(shù)據(jù)歸一化,返回歸一化后的矩陣,數(shù)據(jù)范圍,數(shù)據(jù)最小值normMat, ranges, minVals = autoNorm(datingDataMat)#獲得normMat的行數(shù)m = normMat.shape[0]#百分之十的測試數(shù)據(jù)的個(gè)數(shù)numTestVecs = int(m * hoRatio)#分類錯(cuò)誤計(jì)數(shù)errorCount = 0.0for i in range(numTestVecs):#前numTestVecs個(gè)數(shù)據(jù)作為測試集,后m-numTestVecs個(gè)數(shù)據(jù)作為訓(xùn)練集classifierResult = classify0(normMat[i,:], normMat[numTestVecs:m,:],datingLabels[numTestVecs:m], 4)print("分類結(jié)果:%d\t真實(shí)類別:%d" % (classifierResult, datingLabels[i]))if classifierResult != datingLabels[i]:errorCount += 1.0print("錯(cuò)誤率:%f%%" %(errorCount/float(numTestVecs)*100))""" 函數(shù)說明:main函數(shù)Parameters:無 Returns:無Modify:2018-03-09 """ if __name__ == '__main__':datingClassTest()

    從圖2.6驗(yàn)證分類器結(jié)果中可以看出,錯(cuò)誤率是3%。我們可以改變函數(shù)datingClassTest內(nèi)變量hoRatio和分類器k的值,檢測錯(cuò)誤率是否隨著變量值的變化而增加。依賴于分類算法、數(shù)據(jù)集和程序設(shè)置,分類器的輸出結(jié)果可能有很大的不同。

    2.2.5 使用算法:構(gòu)建完整可用系統(tǒng)

    我們可以給海倫一個(gè)小段程序,通過該程序海倫會(huì)在約會(huì)網(wǎng)站上找到某個(gè)人并輸入他的信息。程序會(huì)給出她對男方喜歡程度的預(yù)測值。

    在kNN_test2.py文件中創(chuàng)建函數(shù)classifyPerson,代碼如下:

    import numpy as np import operator""" 函數(shù)說明:kNN算法,分類器Parameters:inX - 用于分類的數(shù)據(jù)(測試集)dataSet - 用于訓(xùn)練的數(shù)據(jù)(訓(xùn)練集)labels - 分類標(biāo)簽k - kNN算法參數(shù),選擇距離最小的k個(gè)點(diǎn) Returns:sortedClassCount[0][0] - 分類結(jié)果Modify:2018-03-09 """ def classify0(inX, dataSet, labels, k):#numpy函數(shù)shape[0]返回dataSet的行數(shù)dataSetSize = dataSet.shape[0]#在列向量方向上重復(fù)inX共1次(橫向),行向量方向上重復(fù)inX共dataSetSize次(縱向)diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet#二維特征相減后平方sqDiffMat = diffMat**2#sum()所有元素相加,sum(0)列相加,sum(1)行相加sqDistances = sqDiffMat.sum(axis=1)#開方,計(jì)算出距離distances = sqDistances**0.5#返回distances中元素從小到大排序后的索引值sortedDistIndices = distances.argsort()#定一個(gè)記錄類別次數(shù)的字典classCount = {}for i in range(k):#取出前k個(gè)元素的類別voteIlabel = labels[sortedDistIndices[i]]#dict.get(key,default=None),字典的get()方法,返回指定鍵的值,如果值不在字典中返回默認(rèn)值。#計(jì)算類別次數(shù)classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#python3中用items()替換python2中的iteritems()#key=operator.itemgetter(1)根據(jù)字典的值進(jìn)行排序#key=operator.itemgetter(0)根據(jù)字典的鍵進(jìn)行排序#reverse降序排序字典sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#返回次數(shù)最多的類別,即所要分類的類別return sortedClassCount[0][0]""" 函數(shù)說明:打開并解析文件,對數(shù)據(jù)進(jìn)行分類:1代表不喜歡,2代表魅力一般,3代表極具魅力Parameters:filename - 文件名 Returns:returnMat - 特征矩陣classLabelVector - 分類Label向量Modify:2018-03-09 """ def file2matrix(filename):#打開文件fr = open(filename)#讀取文件所有內(nèi)容arrayOLines = fr.readlines()#得到文件行數(shù)numberOfLines = len(arrayOLines)#返回的NumPy矩陣,解析完成的數(shù)據(jù):numberOfLines行,3列returnMat = np.zeros((numberOfLines,3))#返回的分類標(biāo)簽向量classLabelVector = []#行的索引值index = 0for line in arrayOLines:#s.strip(rm),當(dāng)rm空時(shí),默認(rèn)刪除空白符(包括'\n','\r','\t',' ')line = line.strip()#使用s.split(str="",num=string,cout(str))將字符串根據(jù)'\t'分隔符進(jìn)行切片。listFromLine = line.split('\t')#將數(shù)據(jù)前三列提取出來,存放到returnMat的NumPy矩陣中,也就是特征矩陣returnMat[index,:] = listFromLine[0:3]#根據(jù)文本中標(biāo)記的喜歡的程度進(jìn)行分類,1代表不喜歡,2代表魅力一般,3代表極具魅力if listFromLine[-1] == 'didntLike':classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':classLabelVector.append(3)index += 1return returnMat, classLabelVector""" 函數(shù)說明:對數(shù)據(jù)進(jìn)行歸一化Parameters:dataSet - 特征矩陣 Returns:normDataSet - 歸一化后的特征矩陣ranges - 數(shù)據(jù)范圍minVals - 數(shù)據(jù)最小值Modify:2018-03-09 """ def autoNorm(dataSet):#獲得數(shù)據(jù)的最小值minVals = dataSet.min(0)maxVals = dataSet.max(0)#最大值和最小值的范圍ranges = maxVals - minVals#shape(dataSet)返回dataSet的矩陣行列數(shù)normDataSet = np.zeros(np.shape(dataSet))#返回dataSet的行數(shù)m = dataSet.shape[0]#原始值減去最小值normDataSet = dataSet - np.tile(minVals, (m, 1))#除以最大和最小值的差,得到歸一化數(shù)據(jù)normDataSet = normDataSet / np.tile(ranges, (m, 1))#返回歸一化數(shù)據(jù)結(jié)果,數(shù)據(jù)范圍,最小值return normDataSet, ranges, minVals""" 函數(shù)說明:通過輸入一個(gè)人的三維特征,進(jìn)行分類輸出Parameters:無 Returns:無Modify:2018-03-09 """ def classifyPerson():#輸出結(jié)果resultList = ['討厭','有些喜歡','非常喜歡']#三維特征用戶輸入precentTats = float(input("玩視頻游戲所耗時(shí)間百分比:"))ffMiles = float(input("每年獲得的飛行常客里程數(shù):"))iceCream = float(input("每周消費(fèi)的冰激淋公升數(shù):"))#打開的文件名filename = "datingTestSet.txt"#打開并處理數(shù)據(jù)datingDataMat, datingLabels = file2matrix(filename)#訓(xùn)練集歸一化normMat, ranges, minVals = autoNorm(datingDataMat)#生成NumPy數(shù)組,測試集inArr = np.array([precentTats, ffMiles, iceCream])#測試集歸一化norminArr = (inArr - minVals) / ranges#返回分類結(jié)果classifierResult = classify0(norminArr, normMat, datingLabels, 3)#打印結(jié)果print("你可能%s這個(gè)人" % (resultList[classifierResult-1]))""" 函數(shù)說明:main函數(shù)Parameters:無 Returns:無Modify:2018-03-09 """ if __name__ == '__main__':classifyPerson()

    2.3 手寫識別系統(tǒng)

    預(yù)處理:32*32的黑白圖像
    盡管采用本文格式存儲(chǔ)圖像不能有效地利用內(nèi)存空間,但是為了方便理解,我們將圖片轉(zhuǎn)換為文本格式,數(shù)字的文本格式如圖所示。

    步驟:
    1)收集數(shù)據(jù):提供文本文件
    2)準(zhǔn)備數(shù)據(jù):編寫函數(shù)classify0(),將圖像格式轉(zhuǎn)換為分類器使用的list格式
    3)分析數(shù)據(jù):在python命令提示符中檢查數(shù)據(jù),確保它符合要求
    4)訓(xùn)練算法:此步驟不適合于k-近鄰分類器
    5)測試算法:使用提供的部分?jǐn)?shù)據(jù)集作為測試樣本,測試與非測試樣本的區(qū)別在于測試樣本是已經(jīng)完成分類的數(shù)據(jù),如果預(yù)測與實(shí)際的不同,則標(biāo)記為一個(gè)錯(cuò)誤。
    6)使用算法:可以從圖像中提取數(shù)字,并完成數(shù)字識別。

    2.3.1 準(zhǔn)備數(shù)據(jù):將圖像轉(zhuǎn)化為測試向量

    對于這樣已經(jīng)整理好的文本,我們可以直接使用Python處理,進(jìn)行數(shù)字預(yù)測。數(shù)據(jù)集分為訓(xùn)練集和測試集,使用上小結(jié)的方法,自己設(shè)計(jì)k-近鄰算法分類器,可以實(shí)現(xiàn)分類。

    為了使用前面的分類器,必須將圖像格式化處理為也向量,我們將把一個(gè)32 * 32的二進(jìn)制圖像矩陣轉(zhuǎn)換為1*1024的向量。代碼如下:

    def img2vector(filename):returnVect =zeros((1,1024))fr=open(filename)for i in range(32):lineSrt=fr.readline()for j in range(32):returnVect[0,32*i+j]=int(lineStr[j])return returnVect

    2.3.2 使用sklearn實(shí)現(xiàn)手寫體識別

    Scikit learn 也簡稱sklearn,是機(jī)器學(xué)習(xí)領(lǐng)域當(dāng)中最知名的python模塊之一。sklearn包含了很多機(jī)器學(xué)習(xí)的方式:

    • Classification 分類
    • Regression 回歸
    • Clustering 非監(jiān)督分類
    • Dimensionality reduction 數(shù)據(jù)降維
    • Model Selection 模型選擇
    • Preprocessing 數(shù)據(jù)與處理

    使用sklearn可以很方便地讓我們實(shí)現(xiàn)一個(gè)機(jī)器學(xué)習(xí)算法。一個(gè)復(fù)雜度算法的實(shí)現(xiàn),使用sklearn可能只需要調(diào)用幾行API即可。所以學(xué)習(xí)sklearn,可以有效減少我們特定任務(wù)的實(shí)現(xiàn)周期。
    sklearn實(shí)現(xiàn)k-近鄰算法官網(wǎng)介紹

    class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=1, **kwargs) Parameters: n_neighbors : int, optional (default = 5) Number of neighbors to use by default for kneighbors queries. 默認(rèn)為5,就是k-NN的k的值,選取最近的k個(gè)點(diǎn)。weights : str or callable, optional (default = ‘uniform’) weight function used in prediction. Possible values:‘uniform’ : uniform weights. All points in each neighborhood are weighted equally.‘distance’ : weight points by the inverse of their distance. in this case, closer neighbors of a query point will have a greater influence than neighbors which are further away.[callable] : a user-defined function which accepts an array of distances, and returns an array of the same shape containing the weights.默認(rèn)是uniform,參數(shù)可以是uniform、distance,也可以是用戶自己定義的函數(shù)。uniform是均等的權(quán)重,就說所有的鄰近點(diǎn)的權(quán)重都是相等的。distance是不均等的權(quán)重,距離近的點(diǎn)比距離遠(yuǎn)的點(diǎn)的影響大。用戶自定義的函數(shù),接收距離的數(shù)組,返回一組維數(shù)相同的權(quán)重。algorithm : {‘a(chǎn)uto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, optional Algorithm used to compute the nearest neighbors: ‘ball_tree’ will use BallTree ‘kd_tree’ will use KDTree ‘brute’ will use a brute-force search. ‘a(chǎn)uto’ will attempt to decide the most appropriate algorithm based on the values passed to fit method. Note: fitting on sparse input will override the setting of this parameter, using brute force.快速k近鄰搜索算法,默認(rèn)參數(shù)為auto,可以理解為算法自己決定合適的搜索算法。除此之外,用戶也可以自己指定搜索算法ball_tree、kd_tree、brute方法進(jìn)行搜索,brute是蠻力搜索,也就是線性掃描,當(dāng)訓(xùn)練集很大時(shí),計(jì)算非常耗時(shí)。kd_tree,構(gòu)造kd樹存儲(chǔ)數(shù)據(jù)以便對其進(jìn)行快速檢索的樹形數(shù)據(jù)結(jié)構(gòu),kd樹也就是數(shù)據(jù)結(jié)構(gòu)中的二叉樹。以中值切分構(gòu)造的樹,每個(gè)結(jié)點(diǎn)是一個(gè)超矩形,在維數(shù)小于20時(shí)效率高。ball tree是為了克服kd樹高緯失效而發(fā)明的,其構(gòu)造過程是以質(zhì)心C和半徑r分割樣本空間,每個(gè)節(jié)點(diǎn)是一個(gè)超球體。leaf_size : int, optional (default = 30) Leaf size passed to BallTree or KDTree. This can affect the speed of the construction and query, as well as the memory required to store the tree. The optimal value depends on the nature of the problem.默認(rèn)是30,這個(gè)是構(gòu)造的kd樹和ball樹的大小。這個(gè)值的設(shè)置會(huì)影響樹構(gòu)建的速度和搜索速度,同樣也影響著存儲(chǔ)樹所需的內(nèi)存大小。需要根據(jù)問題的性質(zhì)選擇最優(yōu)的大小。p : integer, optional (default = 2) Power parameter for the Minkowski metric. When p = 1, this is equivalent to using manhattan_distance (l1), and euclidean_distance (l2) for p = 2. For arbitrary p, minkowski_distance (l_p) is used.距離度量公式。在上小結(jié),我們使用歐氏距離公式進(jìn)行距離度量。除此之外,還有其他的度量方法,例如曼哈頓距離。這個(gè)參數(shù)默認(rèn)為2,也就是默認(rèn)使用歐式距離公式進(jìn)行距離度量。也可以設(shè)置為1,使用曼哈頓距離公式進(jìn)行距離度量。metric : string or callable, default ‘minkowski’ the distance metric to use for the tree. The default metric is minkowski, and with p=2 is equivalent to the standard Euclidean metric. See the documentation of the DistanceMetric class for a list of available metrics.用于距離度量,默認(rèn)度量是minkowski,也就是p=2的歐氏距離(歐幾里德度量)。metric_params : dict, optional (default = None) Additional keyword arguments for the metric function.距離公式的其他關(guān)鍵參數(shù),這個(gè)可以不管,使用默認(rèn)的None即可。n_jobs : int, optional (default = 1) The number of parallel jobs to run for neighbors search. If -1, then the number of jobs is set to the number of CPU cores. Doesn’t affect fit method.并行處理設(shè)置。默認(rèn)為1,臨近點(diǎn)搜索并行工作數(shù)。如果為-1,那么CPU的所有cores都用于并行工作。

    KNeighborsClassifier提供了以一些方法供我們使用:

    k-近鄰實(shí)現(xiàn)手寫體分類程序:

    import numpy as np import operator from os import listdir from sklearn.neighbors import KNeighborsClassifier as KNN""" 函數(shù)說明:將32*32的二進(jìn)制圖像轉(zhuǎn)化為1*1024的向量 Parameters:filename:文件名 Returns:returnVect:返回的二進(jìn)制圖像的1024向量 Modify:2018-03-12"""def img2Vector(filename):# 創(chuàng)建1*1024零向量returnVect = np.zeros((1, 1024))# 打開文件fr = open(filename)# 按行讀取for i in range(32):# 讀取一行數(shù)據(jù)lineStr = fr.readline()# 每一行的前32個(gè)元素依次添加到returnVect中for j in range(32):returnVect[0, 32 * i + j] = int(lineStr[j])return returnVect""" 函數(shù)說明:手寫體數(shù)字分類Parameters:filename:無 Returns:無 Modify:2018-03-12"""def handwritingClassTest():# 測試集的labelshwLabels = []# 返回trainingDigits目錄下的文件名trainingFileList = listdir('trainingDigits')# 返回文件夾下文件的個(gè)數(shù)m = len(trainingFileList)# 初始化訓(xùn)練的Mat矩陣,測試集trainingMat = np.zeros((m, 1024))# 從文件名中解析出訓(xùn)練集的類別for i in range(m):# 獲得文件的名字fileNameStr = trainingFileList[i]# 獲得分類的數(shù)字classNumber = int(fileNameStr.split('_')[0])# 將獲得的類別添加到hwLabels中hwLabels.append(classNumber)# 將每一個(gè)文件的1*1024數(shù)據(jù)存儲(chǔ)到traingingMat矩陣中trainingMat[i, :] = img2Vector('E:/python/machine learning in action/My Code/chap 02/trainingDigits/%s' % (fileNameStr))# 構(gòu)建KNN分類器neigh = KNN(n_neighbors=3, algorithm='auto')# 擬合模型,trainingMat為測試矩陣,hwLabels為對應(yīng)的標(biāo)簽neigh.fit(trainingMat, hwLabels)# 返回testDigirs目錄下的文件列表testFileList = listdir('testDigits')# 錯(cuò)誤檢測計(jì)數(shù)errorCount = 0.0# 測試數(shù)據(jù)的數(shù)量mTest = len(testFileList)# 從文件中解析出測試集的類別并進(jìn)行分類測試for i in range(mTest):# 獲得文件的名字fileNameStr = testFileList[i]# 獲得分類的數(shù)字classNumber = int(fileNameStr.split('_')[0])# 獲得測試集的1*1024向量,用于訓(xùn)練vectorUnderTest = img2Vector('testDigits/%s' % (fileNameStr))# 獲得預(yù)測結(jié)果classifierResult = neigh.predict(vectorUnderTest)print("分類返回結(jié)果為%d\t真實(shí)結(jié)果為%d" % (classifierResult, classNumber))if (classifierResult != classNumber):errorCount += 1.0print("共錯(cuò)誤數(shù)據(jù)為%d,錯(cuò)誤率為%f%%" % (errorCount, errorCount / mTest * 100))""" 函數(shù)說明:main函數(shù)Parameters:無 Returns:無 Modify:2018-03-12""" if __name__ == '__main__':handwritingClassTest()

    結(jié)果:

    還可以通過修改程序中的參數(shù)來修改不同的距離度量方法和精度等。

    2.4 KNN算法的優(yōu)缺點(diǎn)

    2.4.1 優(yōu)點(diǎn)

    • 簡單好用,容易理解,精度高,理論成熟,既可以用來做分類也可以用來做回歸;
    • 可用于數(shù)值型數(shù)據(jù)和離散型數(shù)據(jù);
    • 訓(xùn)練時(shí)間復(fù)雜度為O(n);無數(shù)據(jù)輸入假定;
    • 對異常值不敏感。

    2.4.2 缺點(diǎn):

    • 計(jì)算復(fù)雜性高;空間復(fù)雜性高;
    • 樣本不平衡問題(即有些類別的樣本數(shù)量很多,而其它樣本的數(shù)量很少);
    • 一般數(shù)值很大的時(shí)候不用這個(gè),計(jì)算量太大。但是單個(gè)樣本又不能太少,否則容易發(fā)生誤分。
    • 最大的缺點(diǎn)是無法給出數(shù)據(jù)的內(nèi)在含義。

    總結(jié)

    以上是生活随笔為你收集整理的机器学习实战(二)——k-近邻算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    久久艹综合 | 久久99精品一区二区三区三区 | 黄色成人av| 亚州日韩中文字幕 | 精品视频久久久 | 在线观看麻豆av | 国产精品一区免费在线观看 | 91手机视频在线 | 成人91在线 | 丝袜av网站 | 天天久久夜夜 | 日韩欧在线 | 日韩欧美久久 | 日韩欧美在线观看一区二区 | 久草在线免费在线观看 | 亚洲综合狠狠干 | 日韩美在线观看 | 欧美性黄网官网 | 日本黄网站 | 久久视频这里有精品 | 亚洲最快最全在线视频 | 天天曰视频 | 国产美女精彩久久 | www,黄视频| 婷婷激情综合 | 免费看黄色大全 | 在线高清| 久久精品中文视频 | 激情五月在线 | 日韩欧美视频一区二区三区 | 亚洲一区日韩在线 | 国产精品免费视频一区二区 | 久久免费99精品久久久久久 | 亚洲一区免费在线 | 国产小视频免费在线观看 | 国产精品视频资源 | 四虎5151久久欧美毛片 | 在线一二三四区 | 亚洲精品黄网站 | 欧美analxxxx | 天天天天天天干 | 99色在线| 麻豆 videos | 91精品播放| 欧美日韩视频 | 四虎影院在线观看av | 日韩精品播放 | 日韩欧美一二三 | 日韩美女高潮 | 在线观看国产区 | 亚洲aⅴ乱码精品成人区 | 丝袜精品视频 | 成人在线视频免费看 | 五月天久久久久久 | 国产高清在线永久 | 日韩中文字幕在线不卡 | 成年人在线免费看 | 91成人久久| 久久99欧美 | 免费观看性生交大片3 | 日韩欧美一区二区在线观看 | 亚洲天天摸日日摸天天欢 | 国产精品美女www爽爽爽视频 | 亚洲国产精品99久久久久久久久 | 又黄又刺激又爽的视频 | 国产一区二区精品久久 | 中文字幕在线观看免费 | 久青草影院 | 国产精品中文在线 | 综合色站导航 | 人人玩人人爽 | 亚洲美女视频在线观看 | 日韩在线免费小视频 | 大型av综合网站 | 男女全黄一级一级高潮免费看 | 亚洲精品在线播放视频 | wwxxxx日本 | 亚洲aⅴ免费在线观看 | 久久美女视频 | 综合色中色 | 天天操比| 国产成人三级一区二区在线观看一 | 中文字幕色婷婷在线视频 | 中文字幕在线免费 | 久热电影 | av成人免费在线观看 | 国产露脸91国语对白 | 色婷婷久久久综合中文字幕 | 日韩欧美高清 | 天天操天天射天天爽 | 91桃色在线播放 | 伊人射 | 欧洲视频一区 | 欧美一区二区在线刺激视频 | 日本不卡一区二区三区在线观看 | 亚洲黄色软件 | 黄色网www | 久久综合狠狠综合久久综合88 | 最近中文字幕久久 | 一区二区精品视频 | 免费三级大片 | 91精品国产综合久久福利不卡 | 成人a v视频 | 在线观看免费成人av | 五月婷婷中文网 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 最近更新好看的中文字幕 | 丁香电影小说免费视频观看 | 在线免费观看的av | 天堂久久电影网 | 天天爱天天干天天爽 | 丁香激情综合国产 | 99精品在线视频观看 | 午夜精品一区二区三区在线观看 | 四虎影视4hu4虎成人 | 婷婷 中文字幕 | 蜜臀av性久久久久av蜜臀妖精 | 欧美午夜一区二区福利视频 | 国产精品18久久久久白浆 | 国产99久久久精品 | 久草精品在线观看 | 欧美精品一区在线发布 | 欧美视频网址 | 99久久精品无码一区二区毛片 | 欧美日韩一区二区视频在线观看 | 日本在线观看黄色 | 中文字幕一区二区三区四区久久 | 日韩一二三 | 国产一级视频 | 成年人免费电影在线观看 | 日韩理论片在线观看 | 国产又粗又猛又黄 | 日韩性色 | 99久久毛片 | 99r在线观看| 日本公妇在线观看高清 | 日本黄色免费电影网站 | 日韩电影一区二区三区在线观看 | 日韩国产精品一区 | 成人av在线电影 | 国产高清av在线播放 | a午夜在线 | 日韩高清精品免费观看 | 成人在线视频在线观看 | 国产夫妻性生活自拍 | 久久伊人婷婷 | 91精品毛片| 在线免费观看黄网站 | 在线色资源| 一区二区激情视频 | 成人av片在线观看 | 久久久久久久久久亚洲精品 | 在线观看av大片 | 激情综合五月婷婷 | 丝袜美女在线观看 | 在线观看视频你懂得 | 成年人视频在线免费播放 | 一区二区欧美在线观看 | 日日夜夜网站 | 亚洲色图激情文学 | 日韩在线一级 | 久久精品一区二区三区视频 | 91精品啪啪 | 国产精品2019 | 岛国一区在线 | 日本中文在线播放 | 日韩精品中文字幕在线不卡尤物 | 免费在线黄色av | 亚洲91av | 国产一级视频在线 | 国产精品视频在线看 | 日韩一区二区三免费高清在线观看 | 中文字幕视频三区 | 成人资源在线播放 | 日韩精品一区二区免费 | 欧洲精品视频一区二区 | 国产中文字幕在线免费观看 | 欧美性性网 | 成人影片在线免费观看 | 我要色综合天天 | av在线免费网站 | 97在线免费视频 | 婷婷六月综合亚洲 | 免费国产黄线在线观看视频 | 射射色| 精品在线播放视频 | 国产这里只有精品 | 久久艹国产视频 | 国产成人精品免高潮在线观看 | 久操中文字幕在线观看 | 日韩免费在线视频观看 | 色婷婷综合久久久中文字幕 | 狠狠干天天色 | 97在线免费视频观看 | 亚洲高清色综合 | 午夜av一区二区三区 | 久久情侣偷拍 | 国产黄a三级三级 | 精品在线观看一区二区三区 | 久草在线观看 | 伊人资源站 | 国产美女精品视频免费观看 | 日韩精品综合在线 | 国产伦理久久 | 国产精品乱码一区二三区 | 五月天久久综合网 | 最近最新中文字幕视频 | 国产精品电影一区 | 国产精品不卡在线观看 | 久久久久久久久久福利 | 免费在线观看成人av | 色综合婷婷久久 | 中日韩欧美精彩视频 | 性色av免费在线观看 | 伊人婷婷网 | 天天操天天操天天操天天操天天操天天操 | 国产一区视频在线播放 | 欧美日韩国产一区二 | 国产精品久久 | 亚洲免费成人av电影 | 日韩av专区 | 一区二区三区精品在线视频 | 日韩av一区二区在线播放 | 久久久久激情电影 | 国产精品久久久久久五月尺 | 久久另类小说 | 中文字幕在线中文 | 美女网站视频免费都是黄 | 91av成人| 午夜av一区| 人人爽人人爽人人片av免 | 91精品一区二区在线观看 | 九九视频网 | 亚洲精品999| 激情综合亚洲 | 人人dvd| 国产精品一区二区久久精品爱微奶 | 激情综合五月婷婷 | 男女激情免费网站 | 超碰人人在线 | 久久ww| 天堂av免费观看 | 一区二区三区高清 | 亚洲va天堂va欧美ⅴa在线 | av大片网站 | 国产日韩视频在线观看 | www.黄色 | 九九热视频在线免费观看 | 久久国产精品免费一区二区三区 | 国产高清av在线播放 | 玖玖综合网 | 亚洲精品乱码久久久久久蜜桃欧美 | 美腿丝袜一区二区三区 | 午夜影院在线观看18 | 五月婷婷黄色 | 黄色福利视频网站 | 久久久国产精品一区二区中文 | 超碰国产在线观看 | 久久国产经典 | 久久久国产一区二区 | 国产麻豆视频免费观看 | 九九九视频精品 | 最新日韩视频 | 中文字幕av有码 | 开心色婷婷| 亚洲午夜电影网 | 国产网红在线观看 | 国产精品免费不卡 | 欧美一区二区视频97 | 色九九在线 | 亚洲有 在线 | 国产一区二区久久 | 日本性久久 | 国产精品久久久久一区二区三区共 | 亚洲成年人在线播放 | 久久久精品免费观看 | 国产精品午夜在线观看 | 麻豆免费视频观看 | 色婷婷影视 | 91色在线观看 | 久操视频在线播放 | 久草视频在 | 99精品视频免费看 | 久久深夜福利免费观看 | 亚洲欧美成人网 | 在线精品在线 | 日日射天天射 | 麻豆传媒视频在线播放 | 久久久婷 | 伊人六月 | 日韩激情网 | 日本少妇久久久 | 中文字幕在线观看一区二区三区 | 久久久久久国产精品亚洲78 | 黄色高清视频在线观看 | 深夜免费小视频 | 狠狠干我| 福利视频一区二区 | 亚洲精品日韩在线观看 | 福利一区二区三区四区 | 国产做a爱一级久久 | 天天干天天操av | 在线看片中文字幕 | 99久精品| 2019国产精品 | 久久综合激情 | 在线免费精品视频 | 91看片麻豆 | 久色小说 | 日韩中文在线观看 | 亚洲一级电影 | 免费看短 | 99在线热播精品免费 | 精品视频免费播放 | 成年人免费看片网站 | 久草视频免费在线播放 | 国产手机在线观看 | 美女视频黄,久久 | 91中文字幕网 | 九九久久婷婷 | 久久成人午夜视频 | 在线v片| 九九视频这里只有精品 | 九色激情网 | 91.精品高清在线观看 | 白丝av在线 | 黄色在线成人 | 最新av免费在线观看 | 日韩高清无线码2023 | 免费观看性生活大片 | 久草在线资源免费 | 在线精品一区二区 | 亚洲作爱 | 日韩网站视频 | 成人小电影在线看 | 91视频在线观看下载 | 日本三级久久久 | 韩国精品在线 | 青青网视频 | 成人app在线播放 | 天天色棕合合合合合合 | 有码中文字幕 | 久久96国产精品久久99漫画 | 亚洲天堂网在线视频 | 亚洲国产中文字幕在线视频综合 | 日日日日日 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 色噜噜狠狠色综合中国 | 成年人免费在线观看网站 | 日本精品一区二区在线观看 | 999精品在线 | 欧美日在线观看 | 一区二区三区在线视频111 | 欧美日韩视频在线观看一区二区 | 成人久久影院 | 91av成人 | 久草91视频 | 在线观看久草 | 国产69精品久久99的直播节目 | 狠狠干网 | 99在线精品视频观看 | 国产精品1区 | 成人黄色资源 | 亚洲精品美女久久久久 | 色婷婷久久久综合中文字幕 | 日韩免费看视频 | 奇米777777 | 午夜精品一区二区三区在线视频 | 婷婷婷国产在线视频 | 国产精品淫 | www免费看 | 91视频麻豆 | 天天视频亚洲 | 精品一区中文字幕 | 狠狠gao | 在线看片日韩 | 在线免费av观看 | 超碰97久久 | 成人在线观看av | 97精品久久人人爽人人爽 | 91电影福利 | 亚洲精品国产综合99久久夜夜嗨 | 91视频麻豆视频 | 中文十次啦 | 最近久乱中文字幕 | 欧美国产日韩一区二区 | 精品在线免费视频 | 999久久国产| www.狠狠| 毛片网在线| 狠狠干网| 99精品国产兔费观看久久99 | 天天综合网~永久入口 | 国产色资源| 97超碰中文字幕 | 日韩精品一区二区三区水蜜桃 | 一区二区三区污 | 欧美日韩中文在线视频 | 久久中文精品视频 | 天天操天天色天天 | 18国产精品福利片久久婷 | 久久免费国产视频 | 国产成人一区二区精品非洲 | 国产一级片不卡 | 精品一区二区在线看 | 九九久久久久久久久激情 | 激情影院在线观看 | 黄在线| 久久久久观看 | 欧美性生活免费 | 久热免费在线观看 | www蜜桃视频 | 成人网在线免费视频 | 亚洲视频久久久 | av中文字幕网站 | 最近中文字幕高清字幕在线视频 | 成 人 黄 色 视频播放1 | 69国产成人综合久久精品欧美 | 国产精品日韩高清 | 一区二区丝袜 | 91精品国产电影 | 久久69精品 | 精品视频在线视频 | 在线成人高清电影 | 中文字幕一区二区在线观看 | 国产精品孕妇 | 欧美日韩国产一区二区在线观看 | 国产成人99久久亚洲综合精品 | 五月婷婷在线播放 | 亚洲久久视频 | 日韩aⅴ视频 | 精品在线播放 | 亚洲高清视频在线播放 | 九九九毛片| 日韩在线精品一区 | 超碰资源在线 | 精品福利在线 | 久久综合偷偷噜噜噜色 | 亚洲永久精品在线 | 97人人艹 | 高清免费在线视频 | 丁香婷婷综合激情 | 欧美色图p| 久久综合免费视频 | 碰超在线观看 | 成 人 a v天堂| www.久久色 | 欧美不卡视频在线 | 丁香婷婷综合激情五月色 | 麻豆视频免费入口 | 91精品影视 | 日韩高清三区 | www.亚洲黄 | 国产精品久久久久久久久久免费 | 国产伦精品一区二区三区无广告 | 激情综合一区 | 日日综合 | 欧美少妇xxx | 日本中文字幕在线看 | 在线观看日韩精品 | 欧美在线一级片 | 国产无遮挡又黄又爽在线观看 | 中文字幕高清 | 大型av综合网站 | 中文字幕在线视频一区二区三区 | 天天伊人网| 欧美精品国产综合久久 | 欧美日韩视频在线观看免费 | 久草免费福利在线观看 | 麻豆精品传媒视频 | 天天干视频在线 | 亚洲国产电影在线观看 | 99精品热视频 | 国产免费久久精品 | 午夜少妇一区二区三区 | 香蕉网在线| 免费黄在线看 | av中文在线观看 | 精品国产一二三四区 | 丁香婷婷射 | 国产 成人 久久 | 国产探花| 成人a视频在线观看 | 天堂网一区二区 | 精品一区精品二区高清 | 久久精品视频国产 | 国产黄网站在线观看 | 激情av在线播放 | 黄色福利视频网站 | 中文字幕在线观看网址 | 91精品对白一区国产伦 | 色久天| 五月婷在线播放 | 国产精品完整版 | 免费在线观看午夜视频 | 国产免费国产 | 久久成人麻豆午夜电影 | 国产99视频在线观看 | 免费成人av在线看 | av片子在线观看 | 国产系列在线观看 | 久久久久99精品成人片三人毛片 | 国产精品99久久久久久人免费 | 中文字幕视频 | 亚洲精品玖玖玖av在线看 | 国产精品久久久久国产精品日日 | 亚洲一区二区三区四区在线视频 | 69av免费视频 | 在线观看小视频 | 中文字幕第一页在线播放 | 欧美久久久久久久久中文字幕 | 一区二区三区四区久久 | 精品一区二三区 | 五月天伊人网 | 少妇视频一区 | 欧美日韩高清一区二区三区 | 成人一级在线观看 | 亚洲情感电影大片 | 国产区 在线 | 色99中文字幕 | 97超碰人人模人人人爽人人爱 | 亚洲va综合va国产va中文 | 国产精品对白一区二区三区 | 中文字幕亚洲五码 | 中文字幕第一页在线播放 | 国产精品久久久久久久久搜平片 | 久草电影在线观看 | 992tv又爽又黄的免费视频 | 色婷婷在线播放 | 色综合久久综合中文综合网 | 中文字幕资源在线观看 | aⅴ视频在线 | 视频在线91 | 日韩av免费在线看 | 96精品在线 | 黄色一级免费 | 日韩亚洲欧美中文字幕 | 午夜在线看片 | 国产在线毛片 | 日韩1页 | 人人狠狠 | 久久精品观看 | 日本久久高清视频 | 午夜精品999 | 国产亚洲精品女人久久久久久 | 午夜视频在线观看一区二区三区 | 国产成人亚洲在线电影 | 国产成人精品一区二区三区在线 | 国产成人61精品免费看片 | 婷婷综合视频 | 美女视频黄在线观看 | 日韩理论视频 | 亚洲精品在线资源 | av解说在线观看 | 日韩欧美网站 | 97视频在线免费观看 | 欧美成年性 | 91精品国产亚洲 | 久久精品久久99 | 日韩美女免费线视频 | 激情视频久久 | 久久综合影音 | 中文字幕第 | 精精国产xxxx视频在线播放 | 日韩精品久久久久久久电影竹菊 | 蜜臀aⅴ国产精品久久久国产 | 亚洲国产资源 | 国产高清视频免费最新在线 | 一二三区在线 | 91看毛片 | 午夜免费在线观看 | 九色最新网址 | 亚洲精品tv| 亚洲区视频在线观看 | 婷婷五月情 | 一级黄色毛片 | 成人久久久久久久久 | 西西4444www大胆无视频 | 亚洲高清在线观看视频 | 成人免费电影 | 国产黑丝袜在线 | 久久亚洲福利视频 | 一本一本久久a久久精品综合妖精 | 欧美日韩综合在线 | 三级大片网站 | 99精品亚洲| 久久一区二| 国产午夜精品免费一区二区三区视频 | 国产成视频在线观看 | 成人黄色视 | 久久久久国产精品免费 | 亚洲激情一区二区三区 | 久久视频 | 91麻豆精品国产自产在线 | 九九九九九国产 | 久久艹艹 | 婷婷亚洲五月色综合 | 91高清不卡 | 992tv人人网tv亚洲精品 | 国产午夜免费视频 | 亚洲 欧美 91| 亚州av成人 | a天堂最新版中文在线地址 久久99久久精品国产 | 亚洲一级片在线看 | 丁香在线视频 | 欧美,日韩 | 91麻豆精品国产91久久久久久久久 | 激情 婷婷 | 国产精品美女久久久久久2018 | 久久久久亚洲国产 | 精品久久久久久电影 | 久草在线播放视频 | 久久久久北条麻妃免费看 | 国内精品久久久精品电影院 | 欧美色伊人 | 91豆花在线观看 | 国产99久久久国产精品免费看 | 国产成人在线观看免费 | 97视频免费看| 日韩av快播电影网 | 久久99精品久久只有精品 | 国产精品成人自产拍在线观看 | 久久久午夜精品理论片中文字幕 | 久久久久成人精品亚洲国产 | 久精品视频在线观看 | 女人魂免费观看 | 久久国产香蕉视频 | 西西444www高清大胆 | 99国产一区二区三精品乱码 | 欧美精品久久久久久久久久 | 亚洲精品小视频在线观看 | 九九热99视频 | 碰天天操天天 | 精品国产免费人成在线观看 | 最新av网址在线观看 | 二区三区在线观看 | 在线va视频 | 中文字幕国产 | 久久99精品国产一区二区三区 | 精品在线免费观看 | 亚洲国产精品va在线看黑人 | 在线免费观看一区二区三区 | 日韩视频专区 | 探花视频在线观看免费版 | 国产福利91精品一区 | 五月天久久综合 | 日本久久综合视频 | 婷婷伊人综合 | 精品在线观看免费 | 久99久在线 | 99这里精品 | 欧美日韩性生活 | 九九交易行官网 | 天天玩天天干 | 中文字幕91在线 | av在线播放观看 | 九九视频在线 | 三级黄色免费 | 免费视频一级片 | 99精品国产在热久久下载 | 欧美日韩免费看 | 国产手机在线 | 日韩欧美在线一区二区 | 91精品视频网站 | 91免费视频网站在线观看 | 国产一区二区在线影院 | 可以免费看av | 婷婷成人亚洲综合国产xv88 | 午夜av剧场 | 免费观看www7722午夜电影 | 91在线看| 久久精品国产久精国产 | 国产不卡视频在线播放 | 欧美性极品xxxx做受 | 日韩在线观看视频中文字幕 | 国产美女视频 | 在线电影a | av成人免费观看 | 国产亚洲婷婷 | 99人成在线观看视频 | 91丨九色丨国产丨porny精品 | 久久久黄色免费网站 | 国产又粗又硬又长又爽的视频 | 少妇自拍av| 在线国产视频一区 | 亚洲免费精品一区二区 | 黄色99视频 | 91视频最新网址 | 日韩a在线 | 国产日韩精品欧美 | 深夜免费网站 | 亚洲色图 校园春色 | 亚洲高清91 | 久久精视频| 日韩理论片| 一区二区精品在线观看 | 蜜臀av网址| 国产伦精品一区二区三区… | 免费在线国产视频 | 91精品国自产在线观看欧美 | 国产精品一区二区你懂的 | 男女精品久久 | 国内精品久久久久久久久久久 | 日韩在线视频一区二区三区 | 九色一区二区 | 欧美污污网站 | 欧美高清成人 | 亚洲精品视频第一页 | 99这里只有 | 国内精品久久久久久久 | 国产精品一区在线观看你懂的 | 亚洲精品久久久久中文字幕二区 | 草久视频在线观看 | 中文字幕一区二区在线播放 | 久久xxxx| 免费在线黄网 | 99一级片| 成人欧美亚洲 | 日本久久久久久久久久久 | 亚洲最大色 | 99性视频| 五月激情六月丁香 | 国产精品大片免费观看 | 伊人午夜视频 | 欧美日韩国产精品一区二区三区 | 日韩美女高潮 | 91亚洲欧美 | 欧美色插 | av在线h| 超碰人人91 | 天天操天天射天天添 | 日韩三区在线观看 | 日本女人逼 | 亚洲日本va午夜在线电影 | 亚洲美女在线国产 | 亚洲午夜大片 | 久久免费视频精品 | 美女久久网站 | 午夜体验区 | 免费看三级 | 中文资源在线播放 | 久久99精品久久久久久秒播蜜臀 | 国产一级电影在线 | 国产在线播放一区 | 天天综合久久 | 欧美久久成人 | 国产精品黄色影片导航在线观看 | free. 性欧美.com| 亚洲无人区小视频 | 韩国一区二区av | 91伊人影院| 久久国产精品第一页 | 免费v片 | 欧美性生活一级片 | 久久中文字幕视频 | 亚洲最新av网址 | 日韩电影一区二区在线 | 天天操天天弄 | 日日干综合 | 97小视频 | 超碰在线观看97 | 久久久久久久久久久电影 | 91视频午夜 | 成人三级视频 | 精品视频免费久久久看 | 免费看三级网站 | 欧美最猛性xxxxx(亚洲精品) | 成人中心免费视频 | 在线免费观看av网站 | 九九视频热 | 97精品国产97久久久久久 | 丁香六月婷婷激情 | av片免费播放 | 在线视频黄 | 一区二区三区在线免费观看视频 | 久久久久久久亚洲精品 | a v在线视频| 日日操夜夜操狠狠操 | 色鬼综合网 | 69视频在线 | 视频一区视频二区在线观看 | www黄在线| 91网址在线观看 | 久久精品国产精品亚洲 | 97视频免费播放 | 亚洲蜜桃在线 | 日韩免费在线观看 | 天天艹天天 | 久久婷婷激情 | 天干啦夜天干天干在线线 | 九九热免费在线视频 | 六月丁香婷婷网 | 免费在线观看日韩视频 | 国产色婷婷 | 日韩性色 | 亚洲精品一区二区久 | 亚洲日本在线一区 | 色在线国产 | 国产成人精品一区二 | 天天干天天操av | 久久久精品国产免费观看同学 | 久久电影中文字幕视频 | 91视频高清免费 | 精品久久五月天 | 丝袜美腿亚洲综合 | 三级黄色三级 | 深爱激情五月网 | 夜夜操夜夜干 | 人人爽人人爽人人爽学生一级 | 大胆欧美gogo免费视频一二区 | 天天爱天天操 | 久久免费毛片视频 | 四虎影视成人永久免费观看亚洲欧美 | 9999精品| 欧美成年人在线观看 | 蜜臀aⅴ国产精品久久久国产 | 中文字幕免费一区 | 91网在线| 最新国产精品视频 | 亚洲国产色一区 | 亚洲专区欧美专区 | 亚洲国产免费av | 蜜桃视频精品 | 99色婷婷 | 色综合久久88色综合天天人守婷 | 久草网视频 | 97视频在线播放 | 国产自产在线视频 | 日韩av资源在线观看 | 日韩三级视频 | 亚洲综合少妇 | 亚洲资源片 | 久久综合狠狠综合久久狠狠色综合 | 久久这里只有精品视频首页 | 婷婷精品视频 | 99色在线视频 | 美女网站一区 | 亚洲精品高清在线 | 婷婷色 亚洲 | 久久社区视频 | 天天做天天爱天天综合网 | 91麻豆免费看 | 中文字幕在线中文 | 国产视频一区在线 | 夜夜爽88888免费视频4848 | 在线观看av免费 | 久久久久久久久久久久久久免费看 | 成人国产精品免费观看 | 免费在线成人 | 色免费在线 | 日韩xxxx视频 | 亚洲国产久| 狠狠色丁香久久婷婷综 | 在线观看中文字幕dvd播放 | 色综合国产| 亚州精品国产 | 美女精品久久久 | 久久亚洲欧美日韩精品专区 | 永久免费精品视频 | 丁香在线观看完整电影视频 | 国产精品视频全国免费观看 | 国产成人精品日本亚洲999 | 久久av影视 | 久久综合中文字幕 | 91在线资源 | 国产精品自产拍在线观看中文 | 国产一级片免费观看 | 福利视频入口 | 丁香 久久 综合 | 在线观看视频黄色 | 91精品久久久久久久99蜜桃 | 美女国产免费 | 欧美性护士 | 日韩色在线 | 最新日韩在线观看视频 | 中文字幕成人一区 | 超碰在线官网 | 成人黄色在线视频 | 久久精品视频免费观看 | 亚洲少妇xxxx| 在线看黄色的网站 | 天天射天天干天天操 | 欧美日韩精品在线视频 | 国产免费高清视频 | 一区二区三区四区五区在线 | 激情五月av | 久久久久亚洲精品中文字幕 | 日日综合 | 国产手机在线精品 | 久久不卡电影 | 久久任你操 | 91精品小视频 | 国产高清免费 | 国产精品伦一区二区三区视频 | 国产视频亚洲 | 免费看短 | 免费a视频 | 黄色网免费 | 99热最新| 国产激情免费 | 日本精品中文字幕在线观看 | 天天搞天天干 | 黄色大片日本免费大片 | 国产破处在线播放 | 亚洲天堂网在线播放 | 2024国产精品视频 | 国产精品18久久久久久久久 | 久久久久久久久久网 | 精品一区二区电影 | av观看网站| 亚洲精品中文字幕视频 | 丝袜精品视频 | 在线a亚洲视频播放在线观看 | 99热精品国产一区二区在线观看 | 亚洲综合在线播放 | 久久免费在线观看 | 亚洲黄色在线观看 | 久久久久99精品国产片 | 日本久久久亚洲精品 | 婷婷www | 成人免费观看av | 欧美午夜精品久久久久 | av中文字幕网 | 午夜精品在线看 | 天天操天天干天天摸 | 97色免费视频| 香蕉视频久久久 | 婷婷干五月 | 精品91| 99久久久久久国产精品 | 99国产视频在线 | 国产精品夜夜夜一区二区三区尤 | 日韩专区av | 久久精品视频在线观看 | 五月天久久激情 | 日日久视频 | 久久久久久蜜桃一区二区 | 在线中文字幕视频 | 日韩理论片中文字幕 | 夜夜澡人模人人添人人看 | 91香蕉视频 | 日韩免费中文 | 日韩字幕| 欧美男同视频网站 | 日韩欧美在线一区二区 | 国产一区二区三区在线免费观看 | 欧美激情h | 99久久夜色精品国产亚洲96 | 最新中文在线视频 | 一区二区中文字幕在线观看 | 国产韩国日本高清视频 | 国产综合香蕉五月婷在线 | 伊人中文在线 | 手机看片中文字幕 | 国产精品黄色 | 人人插人人舔 | 欧美片网站yy | 国产精品99久久久久 | 国产成人精品一区二区三区福利 | 国外成人在线视频网站 | 婷婷开心久久网 | 91禁在线观看 | 日韩在线色视频 | 97伊人网| av成人免费在线看 | 玖玖国产精品视频 | 免费视频 你懂的 | 亚洲免费av网站 | 国产伦精品一区二区三区无广告 | 日韩色av色资源 | av在线超碰| 亚洲一级免费观看 | 色偷偷av男人天堂 | 在线看国产视频 | 色综合久久五月 | 国产日韩中文字幕在线 | 麻豆视频在线看 | 国产精品久久久精品 | 成人毛片100免费观看 | 成人欧美一区二区三区在线观看 | 丝袜av网站 | 超碰在线色 | 香蕉久草 | 人人干狠狠干 | 一级一片免费看 | 婷婷精品| 亚洲午夜久久久久 | 久久99久久久久久 | 亚洲精品99| 精品欧美日韩 | av中文字幕在线播放 | 久久亚洲在线 | 中文字幕传媒 | 中文字幕一区在线 | 婷婷丁香在线观看 | 欧美日韩国产一二三区 | 免费在线观看的av网站 | 色婷婷激情电影 |