使用python實現(xiàn)kNN分類算法-創(chuàng)新互聯(lián)

k-近鄰算法是基本的機(jī)器學(xué)習(xí)算法,算法的原理非常簡單:

成都創(chuàng)新互聯(lián) - 資陽托管服務(wù)器,四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽服務(wù)器托管,德陽服務(wù)器托管,遂寧服務(wù)器托管,綿陽服務(wù)器托管,四川云主機(jī),成都云主機(jī),西南云主機(jī),資陽托管服務(wù)器,西南服務(wù)器托管,四川/成都大帶寬,成都機(jī)柜租用,四川老牌IDC服務(wù)商

輸入樣本數(shù)據(jù)后,計算輸入樣本和參考樣本之間的距離,找出離輸入樣本距離最近的k個樣本,找出這k個樣本中出現(xiàn)頻率最高的類標(biāo)簽作為輸入樣本的類標(biāo)簽,很直觀也很簡單,就是和參考樣本集中的樣本做對比。下面講一講用python實現(xiàn)kNN算法的方法,這里主要用了python中常用的numpy模塊,采用的數(shù)據(jù)集是來自UCI的一個數(shù)據(jù)集,總共包含1055個樣本,每個樣本有41個real的屬性和一個類標(biāo)簽,包含兩類(RB和NRB)。我選取800條樣本作為參考樣本,剩下的作為測試樣本。

下面是分類器的python代碼:

'''
kNNClassify(inputAttr, trainSetPath = '', lenOfInstance = 42, startAttr = 0, stopAttr = 40, posOfClass = 41, numOfRefSamples = 5)函數(shù)
參數(shù):
inputAttr:輸入的屬性向量
trainSetPath:字符串,保存訓(xùn)練樣本的路徑
lenOfInstance:樣本向量的維數(shù)
startAttr:屬性向量在整個樣本向量中的起始下標(biāo)
stopAttr:屬性向量在整個樣本向量中的終止下標(biāo)
posOfClass:類標(biāo)簽的在整個樣本向量中的下標(biāo)
numOfClSamples:選出來進(jìn)行投票的樣本個數(shù)
返回值:
類標(biāo)簽
'''
 
def kNNClassify(inputAttr, trainSetPath = '', lenOfInstance = 42, startAttr = 0, stopAttr = 40, posOfClass = 41, numOfRefSamples = 5):
  fr = open(trainSetPath)
  strOfLine = fr.readline()
  arrayOfLine = numpy.array([0.] * lenOfInstance)
  refSamples = numpy.array([[-1., 0.]] * numOfRefSamples)
  
  #找出屬性中的大值和最小值,用于歸一化
  maxAttr, minAttr = kNNFunction.dataNorm(trainSetPath = trainSetPath, lenOfInstance = lenOfInstance)
  maxAttr = maxAttr[(numpy.array(range(stopAttr - startAttr + 1)) 
            + numpy.array([startAttr] * (stopAttr - startAttr + 1)))]
  minAttr = minAttr[(numpy.array(range(stopAttr - startAttr + 1)) 
            + numpy.array([startAttr] * (stopAttr - startAttr + 1)))]
  attrRanges = maxAttr - minAttr
  
  inputAttr = inputAttr[(numpy.array(range(stopAttr - startAttr + 1)) 
              + numpy.array([startAttr] * (stopAttr - startAttr + 1)))]
  inputAttr = (inputAttr - minAttr) / attrRanges       #歸一化
  
  #將字符串轉(zhuǎn)換為向量并進(jìn)行計算找出離輸入樣本距離最近的numOfRefSamples個參考樣本
  while strOfLine != '' :
    strOfLine = strOfLine.strip()
    strOfLine = strOfLine.split(';')
    
    abandonOrNot = False
    for i in range(lenOfInstance) :
      if strOfLine[i] == 'RB' :
        arrayOfLine[i] = 1.0
      elif strOfLine[i] == 'NRB' :
        arrayOfLine[i] = 0.0
      elif strOfLine[i] != '?' :             #沒有發(fā)現(xiàn)缺失值
        arrayOfLine[i] = float(strOfLine[i])     
        abandonOrNot = False
      else :                      #發(fā)現(xiàn)缺失值
        abandonOrNot = True
        break
    
    if abandonOrNot == True :
      strOfLine = fr.readline()
      continue
    else :
      attr = arrayOfLine[(numpy.array(range(stopAttr - startAttr + 1)) 
                + numpy.array([startAttr] * (stopAttr - startAttr + 1)))]
      attr = (attr - minAttr) / attrRanges      #歸一化    
      classLabel = arrayOfLine[posOfClass]
      distance = (attr - inputAttr) ** 2
      distance = distance.sum(axis = 0)
      distance = distance ** 0.5
      disAndLabel = numpy.array([distance, classLabel])
      refSamples = kNNFunction.insertItem(refSamples, numOfRefSamples, disAndLabel)
      strOfLine = fr.readline()
      continue
    
  #統(tǒng)計每個類標(biāo)簽出現(xiàn)的次數(shù)
  classCount = {}
  for i in range(numOfRefSamples) :
    voteLabel = refSamples[i][1]
    classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
  sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True)
  
  return int(sortedClassCount[0][0])

分享名稱:使用python實現(xiàn)kNN分類算法-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://bm7419.com/article14/geide.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)站導(dǎo)航、移動網(wǎng)站建設(shè)、網(wǎng)站改版、品牌網(wǎng)站建設(shè)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)