欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之最近鄰kNN分類器

 更新時間:2021年10月28日 10:35:01   作者:大牙灣  
這篇文章主要介紹了python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之最近鄰kNN分類器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

K近鄰法是有監(jiān)督學(xué)習(xí)方法,原理很簡單,假設(shè)我們有一堆分好類的樣本數(shù)據(jù),分好類表示每個樣本都一個對應(yīng)的已知類標(biāo)簽,當(dāng)來一個測試樣本要我們判斷它的類別是, 就分別計算到每個樣本的距離,然后選取離測試樣本最近的前K個樣本的標(biāo)簽累計投票, 得票數(shù)最多的那個標(biāo)簽就為測試樣本的標(biāo)簽。

源代碼詳解:

#-*- coding:utf-8 -*- 
#!/usr/bin/python 
 
# 測試代碼 約會數(shù)據(jù)分類 import KNN  KNN.datingClassTest1() 標(biāo)簽為字符串  KNN.datingClassTest2() 標(biāo)簽為整形 
# 測試代碼 手寫字體分類 import KNN  KNN.handwritingClassTest() 
 
from numpy import *  # 科學(xué)計算包 
import operator    # 運(yùn)算符模塊 
from os import listdir # 獲得指定目錄中的內(nèi)容(手寫字體文件夾下樣本txt) 類型命令行 ls 
 
import matplotlib         # 畫圖可視化操作 
import matplotlib.pyplot as plot 
 
# 顯示一個 二維圖 
def myPlot(x, y, labels): 
  fig = plot.figure()#創(chuàng)建一個窗口 
  ax = fig.add_subplot(111)# 畫一個圖 
  #ax.scatter(x,y) 
  ax.scatter(x,y,15.0*array(labels),15.0*array(labels)) # 支持 分類顏色顯示 
  ax.axis([-2,25,-0.2,2.0]) 
  plot.xlabel('Percentage of Time Spent Playing Video Games')# 坐標(biāo)軸名稱 
  plot.ylabel('Liters of Ice Cream Consumed Per Week') 
  plot.show() 
   
 
# 創(chuàng)建假 的數(shù)據(jù)測試 
def createDataSet(): 
  groop = array([[1.0, 1.1],[1.0, 1.0],[0, 0],[0, 0.1]]) # numpy的array 數(shù)組格式 
  labels = ['A','A','B','B']# 標(biāo)簽 list 
  return groop, labels 
 
# 定義 KNN 分類函數(shù) 
def knnClassify0(inX, dataSet, labels, k): 
  # inX 待分類的點(diǎn) 數(shù)據(jù)集和標(biāo)簽 DataSet, label 最近領(lǐng)域個數(shù) k 
  dataSetSize = dataSet.shape[0] # 數(shù)據(jù)集大小(行數(shù))   
  # tile(A,(行維度,列維度)) A沿各個維度重復(fù)的次數(shù) 
  # 點(diǎn)A 重復(fù)每一行 到 數(shù)據(jù)集大小行 
  differeMat = tile(inX, (dataSetSize,1)) - dataSet # 求 待分類點(diǎn) 與個個數(shù)據(jù)集點(diǎn)的 差值 
  sqDiffMat = differeMat**2              # 求 平方 
  sqDistances = sqDiffMat.sum(axis=1)         # 求 和(各行求和) 
  distances = sqDistances**0.5            # 開方 得到 點(diǎn)A 與 數(shù)據(jù)集個點(diǎn) 的歐式距離 
  sortedDistIndicies = distances.argsort()      # 返回 遞增排序后 的 原位置序列(不是值)   
  # 取得最近的 k個點(diǎn) 統(tǒng)計 標(biāo)簽類出現(xiàn)的頻率 
  classCount={} # 字典 
  for i in range(k): 
    voteIlabel = labels[sortedDistIndicies[i]]#從小到大 對應(yīng)距離 數(shù)據(jù)點(diǎn) 的標(biāo)簽 
    classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 # 對于類標(biāo)簽 字典單詞 的 值 + 1     
  # 對 類標(biāo)簽 頻率(字典的 第二列(operator.itemgetter(1))) 排序 從大到小排序 reverse=True 
  sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) 
  return sortedClassCount[0][0] # 返回 最近的 對應(yīng)的標(biāo)簽 
 
 
# 真實(shí)數(shù)據(jù)的處理  輸入TXT文本文件 返回 數(shù)據(jù)集和標(biāo)簽(已轉(zhuǎn)化成數(shù)字) 列表 list 
def file2matrix(filename): 
  fr = open(filename)         # 打開文件        
  numberOfLines = len(fr.readlines()) # 得到文件所有的行數(shù) 
  returnMat = zeros((numberOfLines,3)) 
 # 創(chuàng)建一個用于存儲返回數(shù)據(jù)的矩陣 數(shù)據(jù)集 每個數(shù)據(jù)的大小根據(jù)實(shí)際情況!! 即是 3 列數(shù)應(yīng)根據(jù) 數(shù)據(jù)維度確定 
  classLabelVector = []        # 對應(yīng)標(biāo)簽 
  fr = open(filename) 
  index = 0 
  for line in fr.readlines():     # 每一行 
    line = line.strip()       # 默認(rèn)刪除空白符(包括'\n', '\r', '\t', ' ') 
    listFromLine = line.split('\t') # 按 制表符(\t) 分割字符串 成 元素列表 
    returnMat[index,:] = listFromLine[0:3]     # 前三個為 數(shù)據(jù)集數(shù)據(jù) 
    classLabelVector.append(int(listFromLine[-1])) # 最后一個 為 標(biāo)簽 整形 
    index += 1 
  return returnMat,classLabelVector 
 
 
# 真實(shí)數(shù)據(jù)的處理  輸入TXT文本文件 返回 數(shù)據(jù)集和標(biāo)簽(為字符串) 列表 list 
def file2matrix2(filename): 
  fr = open(filename)         # 打開文件        
  numberOfLines = len(fr.readlines()) # 得到文件所有的行數(shù) 
  returnMat = zeros((numberOfLines,3)) 
 # 創(chuàng)建一個用于存儲返回數(shù)據(jù)的矩陣 數(shù)據(jù)集 每個數(shù)據(jù)的大小根據(jù)實(shí)際情況!! 即是 3 列數(shù)應(yīng)根據(jù) 數(shù)據(jù)維度確定 
  classLabelVector = []        # 對應(yīng)標(biāo)簽 
  fr = open(filename) 
  index = 0 
  for line in fr.readlines():     # 每一行 
    line = line.strip()       # 默認(rèn)刪除空白符(包括'\n', '\r', '\t', ' ') 
    listFromLine = line.split('\t') # 按 制表符(\t) 分割字符串 成 元素列表 
    returnMat[index,:] = listFromLine[0:3]     # 前三個為 數(shù)據(jù)集數(shù)據(jù) 
    classLabelVector.append(str(listFromLine[-1])) # 最后一個 為 標(biāo)簽 字符串型 
    index += 1 
  return returnMat,classLabelVector 
 
 
# 數(shù)據(jù)集 各個類型數(shù)據(jù)歸一化 平等化 影響權(quán)值 
def dataAutoNorm(dataSet): 
  minVals = dataSet.min(0) # 最小值 每一列的 每一種屬性 的最小值 
  maxVals = dataSet.max(0) # 最大值 
  ranges = maxVals - minVals # 數(shù)據(jù)范圍 
  normDataSet = zeros(shape(dataSet)) # 初始化輸出 數(shù)組 
  m = dataSet.shape[0]        # 行維度 樣本總數(shù) 
  normDataSet = dataSet - tile(minVals, (m,1))  # 擴(kuò)展 minVals 成 樣本總數(shù)行m行 1列(屬性值個數(shù)) 
  normDataSet = normDataSet/tile(ranges, (m,1))  # 矩陣除法 每種屬性值 歸一化 numpy庫 為(linalg.solve(matA,matB)) 
  return normDataSet, ranges, minVals       # 返回 歸一化后的數(shù)組 和 個屬性范圍以及最小值 
 
# 約會數(shù)據(jù) KNN分類 測試 
# 標(biāo)簽為 字符串型 
def datingClassTest1(test_ret=0.1): 
  hoRatio = test_ret       # 測試的樣本比例 剩下的作為 訓(xùn)練集 
  datingDataMat,datingLabels = file2matrix2('datingTestSet.txt')        #載入數(shù)據(jù)集 
  normMat, ranges, minVals = dataAutoNorm(datingDataMat) 
  m = normMat.shape[0]      # 總樣本數(shù)量 
  numTestVecs = int(m*hoRatio)  # 總測試樣本數(shù) 
  errorCount = 0.0        # 錯誤次數(shù)記錄 
  for i in range(numTestVecs):  # 對每個測試樣本 
    # KNN 分類            測試樣本    剩下的作為數(shù)據(jù)集        數(shù)據(jù)集對應(yīng)的標(biāo)簽 最近 的三個 
    classifierResult = knnClassify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) 
    print "分類結(jié)果: %s,\t真實(shí)標(biāo)簽: %s" % (classifierResult, datingLabels[i]) 
    if (classifierResult != datingLabels[i]): errorCount += 1.0   
  print "總錯誤次數(shù): %d" % errorCount 
  print "測試總數(shù):  %d" % numTestVecs 
  print "總錯誤率:  %f" % (errorCount/float(numTestVecs)) 
 
# 標(biāo)簽為 整形 int 
def datingClassTest2(test_ret=0.1): 
  hoRatio = test_ret       # 測試的樣本比例 剩下的作為 訓(xùn)練集 
  datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')        #載入數(shù)據(jù)集 
  normMat, ranges, minVals = dataAutoNorm(datingDataMat) 
  m = normMat.shape[0]      # 總樣本數(shù)量 
  numTestVecs = int(m*hoRatio)  # 總測試樣本數(shù) 
  errorCount = 0.0        # 錯誤次數(shù)記錄 
  for i in range(numTestVecs):  # 對每個測試樣本 
    # KNN 分類            測試樣本    剩下的作為數(shù)據(jù)集        數(shù)據(jù)集對應(yīng)的標(biāo)簽 最近 的三個 
    classifierResult = knnClassify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) 
    print "分類結(jié)果: %d, 真實(shí)標(biāo)簽: %d" % (classifierResult, datingLabels[i]) 
    if (classifierResult != datingLabels[i]): errorCount += 1.0   
  print "總錯誤次數(shù): %d" % errorCount 
  print "測試總數(shù):  %d" % numTestVecs 
  print "總錯誤率:  %f" % (errorCount/float(numTestVecs)) 
 
 
# 根據(jù)用戶輸入的 樣本的屬性值 判斷用戶所傾向的類型(有點(diǎn)問題??) 
def classifyPerson(): 
  resultList = ['討厭','一般化','非常喜歡'] 
  percent = float(raw_input("打游戲所花時間比例: ")) 
  mile  = float(raw_input("每年飛行的里程數(shù)量: ")) 
  ice   = float(raw_input("每周消費(fèi)的冰淇淋量: ")) 
  datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')        #載入數(shù)據(jù)集 
  normMat, ranges, minVals  = dataAutoNorm(datingDataMat) 
  # 新測試樣本 歸一化 
  print ranges, minVals 
  testSampArry   = array([mile, percent, ice])  # 用戶輸入的 測試樣例 
  testSampArryNorm = (testSampArry-minVals)/ranges # 樣例歸一化 
  print testSampArry ,testSampArryNorm 
  # 分類 
  classifierResult = knnClassify0(testSampArryNorm,normMat,datingLabels,3) 
  print classifierResult 
  print "他是不是你的菜: ", resultList[classifierResult-1] 
   
 
# 手寫字體 圖像 32*32 像素轉(zhuǎn)化成 1*1024 的向量  
def img2vector(filename): 
  returnVect = zeros((1,1024)) # 創(chuàng)建空的 返回向量 
  fr = open(filename)     # 打開文件 
  for i in range(32):     # 對每一行 
    lineStr = fr.readline() # 每一行元素 
    for j in range(32):   # 每一行的每個值 
      returnVect[0,32*i+j] = int(lineStr[j]) 
  return returnVect 
 
 
# 手寫字體的 KNN識別 每個數(shù)字圖片被轉(zhuǎn)換成 32*32 的 0 1 矩陣 
def handwritingClassTest(k=3): 
  # 得到訓(xùn)練數(shù)據(jù)集 
  hwLabels = []                # 識別的標(biāo)簽 
  trainingFileList = listdir('trainingDigits') # 加載手寫字體訓(xùn)練數(shù)據(jù)集 (所有txt文件列表) 
  m = len(trainingFileList)          # 總訓(xùn)練樣本數(shù) 
  trainingMat = zeros((m,1024))        # 訓(xùn)練數(shù)據(jù)集 
  for i in range(m): 
    fileNameStr = trainingFileList[i]    # 每個訓(xùn)練數(shù)據(jù)樣本文件 0_0.txt 0_1.txt 0_2.txt 
    fileStr = fileNameStr.split('.')[0]   # 以.分割 第一個[0]為文件名  第二個[1]為類型名 txt文件 
    classNumStr = int(fileStr.split('_')[0]) # 以_分割,第一個[0]為該數(shù)據(jù)表示的數(shù)字 標(biāo)簽 
    hwLabels.append(classNumStr)                   # 訓(xùn)練樣本標(biāo)簽 
    trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr) # 訓(xùn)練樣本數(shù)據(jù) 
     
  # 得到測試數(shù)據(jù)集   
  testFileList = listdir('testDigits')     # 測試數(shù)據(jù)集 
  errorCount = 0.0               # 錯誤次數(shù)計數(shù) 
  mTest = len(testFileList)          # 總測試 數(shù)據(jù)樣本個數(shù) 
  for i in range(mTest): 
    fileNameStr = testFileList[i]      # 每個測試樣本文件 
    fileStr = fileNameStr.split('.')[0]   # 得到文件名 
    classNumStr = int(fileStr.split('_')[0]) # 得到對應(yīng)的真實(shí)標(biāo)簽 
    vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)        # 測試樣本數(shù)據(jù) 
    classifierResult = knnClassify0(vectorUnderTest, trainingMat, hwLabels, k) # 分類 
    print "KNN分類標(biāo)簽: %d, 真實(shí)標(biāo)簽: %d" % (classifierResult, classNumStr) 
    if (classifierResult != classNumStr): errorCount += 1.0 
  print "\n總的錯誤次數(shù): %d" % errorCount 
  print "\n總的錯誤比例: %f" % (errorCount/float(mTest)) 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何在windows下安裝Pycham2020軟件(方法步驟詳解)

    如何在windows下安裝Pycham2020軟件(方法步驟詳解)

    這篇文章主要介紹了在windows下安裝Pycham2020軟件方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Python中的異常處理詳解

    Python中的異常處理詳解

    這篇文章主要介紹了Python中的異常處理詳解,在編寫Python程序時,經(jīng)常會遇到各種運(yùn)行時錯誤,這些錯誤會導(dǎo)致程序終止并拋出異常。然而,有時我們希望程序能優(yōu)雅地處理這些錯誤,而不是直接崩潰,這就需要用到異常處理了,需要的朋友可以參考下
    2023-07-07
  • Python之維度dim的定義及其理解使用方式

    Python之維度dim的定義及其理解使用方式

    這篇文章主要介紹了Python之維度dim的定義及其理解使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 淺談Python的文件類型

    淺談Python的文件類型

    下面小編就為大家?guī)硪黄獪\談Python的文件類型。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 分享幾種python 變量合并方法

    分享幾種python 變量合并方法

    這篇文章主要介紹了分享python 變量的合并幾種方法,分享內(nèi)容有l(wèi)ist 合并和str 合并以及dict 合并的分析,下面具體方法介紹,需要的小伙伴可以參考一下
    2022-03-03
  • 對Python Class之間函數(shù)的調(diào)用關(guān)系詳解

    對Python Class之間函數(shù)的調(diào)用關(guān)系詳解

    今天小編就為大家分享一篇對Python Class之間函數(shù)的調(diào)用關(guān)系詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python矩陣列的實(shí)現(xiàn)示例

    python矩陣列的實(shí)現(xiàn)示例

    在Python和NumPy庫的幫助下,矩陣列可以很容易地進(jìn)行各種操作,本文主要介紹了python矩陣列的實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • python 人工智能算法之隨機(jī)森林流程詳解

    python 人工智能算法之隨機(jī)森林流程詳解

    這篇文章主要為大家介紹了python 人工智能算法之隨機(jī)森林流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Python3實(shí)現(xiàn)監(jiān)控新型冠狀病毒肺炎疫情的示例代碼

    Python3實(shí)現(xiàn)監(jiān)控新型冠狀病毒肺炎疫情的示例代碼

    這篇文章主要介紹了Python3實(shí)現(xiàn)監(jiān)控新型冠狀病毒肺炎疫情的示例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Python pandas.DataFrame調(diào)整列順序及修改index名的方法

    Python pandas.DataFrame調(diào)整列順序及修改index名的方法

    這篇文章主要介紹了Python pandas.DataFrame調(diào)整列順序及修改index名的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06

最新評論