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ù)后,計(jì)算輸入樣本和參考樣本之間的距離,找出離輸入樣本距離最近的k個(gè)樣本,找出這k個(gè)樣本中出現(xiàn)頻率最高的類標(biāo)簽作為輸入樣本的類標(biāo)簽,很直觀也很簡單,就是和參考樣本集中的樣本做對比。下面講一講用python實(shí)現(xiàn)kNN算法的方法,這里主要用了python中常用的numpy模塊,采用的數(shù)據(jù)集是來自UCI的一個(gè)數(shù)據(jù)集,總共包含1055個(gè)樣本,每個(gè)樣本有41個(gè)real的屬性和一個(gè)類標(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:屬性向量在整個(gè)樣本向量中的起始下標(biāo) stopAttr:屬性向量在整個(gè)樣本向量中的終止下標(biāo) posOfClass:類標(biāo)簽的在整個(gè)樣本向量中的下標(biāo) numOfClSamples:選出來進(jìn)行投票的樣本個(gè)數(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)行計(jì)算找出離輸入樣本距離最近的numOfRefSamples個(gè)參考樣本 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)計(jì)每個(gè)類標(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實(shí)現(xiàn)kNN分類算法-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://www.rwnh.cn/article14/geide.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站導(dǎo)航、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站改版、品牌網(wǎng)站建設(shè)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容