溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

大數(shù)據(jù)中如何使用k近鄰算法根據(jù)數(shù)據(jù)識(shí)別性別

發(fā)布時(shí)間:2022-01-04 18:18:02 來源:億速云 閱讀:224 作者:柒染 欄目:大數(shù)據(jù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)大數(shù)據(jù)中如何使用k近鄰算法根據(jù)數(shù)據(jù)識(shí)別性別,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

k近鄰算法是最簡單的機(jī)器學(xué)習(xí)算法之一。它可以很方便地用來分類。

需要:

Python環(huán)境

訓(xùn)練集

k近鄰算法其實(shí)就是算不同的特征值之間的距離然后進(jìn)行分類,語言描述太抽象,下面我舉個(gè)例子(求X的性別):

名字擁有衣服的數(shù)量每天化妝打扮的時(shí)間長度性別是
小麗4030
小明1810
小蓉3234
小王2317
小方267
小敏3823
X3515

我們要使用k近鄰算法求出X的性別,就是用X的特征值算出與其他人的特征值的距離,當(dāng)然,我們還需要考慮數(shù)值問題,數(shù)值大的變量對(duì)結(jié)果的影響也大了,像這里,衣服的數(shù)量總體比打扮時(shí)間長度多,對(duì)結(jié)果的影響也更大,但實(shí)際上不應(yīng)該如此。這個(gè)我們到后面再講解如何進(jìn)行處理,公式如下(歐式公式):

大數(shù)據(jù)中如何使用k近鄰算法根據(jù)數(shù)據(jù)識(shí)別性別

如X和小麗的距離就是:

大數(shù)據(jù)中如何使用k近鄰算法根據(jù)數(shù)據(jù)識(shí)別性別

求出X和所有人的距離后,取最短距離的前k個(gè)人的性別,在這k個(gè)人中,出現(xiàn)最多次的那個(gè)性別,就是X的性別。

這里的k就是這個(gè)算法名字的由來,k是可以自取的,隨著樣本數(shù)量的增加應(yīng)該適時(shí)調(diào)整。

首先先構(gòu)造這個(gè)算法的函數(shù):

def classify(X,dataSet,labels,k):
   #X是待測(cè)對(duì)象的特征值矩陣,dataSet是樣本,labels是要分類的特征
   dataSetSize = dataSet.shape[0]
   #求矩陣長度
   minusMat = tile(X,(dataSetSize,1)) - dataSet
   #進(jìn)行減法(tile就是重復(fù)(x,y)次X)
   sqMinusMat = minusMat ** 2
   #平方
   sqDistances = sqMinusMat.sum(axis=1)
   #相加,axis=1就是每一行內(nèi)相加
   distances = sqDistances ** 0.5
   #歐式公式開根
   sortedDistIndicies = distances.argsort()
   #返回?cái)?shù)組中距離從小到大的數(shù)據(jù)的索引
   classCount = {}
   #字典,準(zhǔn)備計(jì)數(shù)
   for i in range(k):
       #執(zhí)行k次
       votelabels = labels[sortedDistIndicies[i]]
       classCount[votelabels] = classCount.get(votelabels,0) + 1
       #尋找存不存在這個(gè)符號(hào),不存在則返回默認(rèn)0,然后加一
   sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse = True)
   # classCount.items() 對(duì)這個(gè)字典里的對(duì)象
   # reverse = True 降序
   # key=operator.itemgetter(1) 根據(jù)第一個(gè)數(shù)值比較 如 'B':2 中的2
   return sortedClassCount[0][0]
   # 返回出現(xiàn)次數(shù)最多的項(xiàng)目

下面我們就用這個(gè)函數(shù)來識(shí)別一下X的性別。

先把樣本集創(chuàng)建出來:

def createDataSet():
   group = array([[40,30],[18,10],[32,34],[23,17],[26,7],[38,23]])
   labels = ['女','男','女','男','男','女']
   return group,labels

寫出X的數(shù)據(jù),并將樣本集和數(shù)據(jù)傳入函數(shù)后運(yùn)行:

X = [35,15]
group,labels = createDataSet()
print(classify(X,group,labels,3))

大數(shù)據(jù)中如何使用k近鄰算法根據(jù)數(shù)據(jù)識(shí)別性別

得到結(jié)果為男性,有點(diǎn)出乎意料。

但是我們還沒有處理權(quán)重問題,之前就提到了,擁有衣服的數(shù)量和每天化妝打扮的時(shí)間長度所占權(quán)重是不一樣的。于是我們需要歸一化特征值。

所謂的歸一化特征值就是將所有的特征值按照其比重轉(zhuǎn)化為0到1之間的值(有點(diǎn)像S函數(shù))。算法是這樣的:

newValue = (oldValue - min) / (max - min)

轉(zhuǎn)換為函數(shù):

def balance(X,dataSet):
   min = dataSet.min(0)
   max = dataSet.max(0)
   #取得兩列的最小最大值
   ranges = max - min
   #取得范圍
   normDataSet = zeros(shape(dataSet))
   #創(chuàng)建一個(gè)同等大小值為零的矩陣
   m = dataSet.shape[0]
   #取得列的長度
   normDataSet = dataSet - tile(min,(m,1))
   #oldValue - min
   normDataSet = normDataSet/tile(ranges,(m,1))
   #(oldValue - min) / (max - min)

   #下面計(jì)算X的

   X_return = zeros(shape(X))
   X_return = X - tile(min,(1,1))
   X_return = X_return / tile(ranges, (1, 1))

   return normDataSet,X_return

X的特征值歸一化后是:

[[ 0.77272727  0.2962963 ]]

而訓(xùn)練集是:

[[ 1.          0.85185185]

 [ 0.          0.11111111]

 [ 0.63636364  1.        ]

 [ 0.22727273  0.37037037]

 [ 0.36363636  0.        ]

 [ 0.90909091  0.59259259]]

顯然,這樣的標(biāo)準(zhǔn)更加科學(xué),不會(huì)因?yàn)槟承?shù)字大而影響變量之間的權(quán)重。

重新計(jì)算:

X = [35,15]
group,labels = createDataSet()
group,X = balance(X,group)
print(X)
print(group)
print(classify(X,group,labels,3))

大數(shù)據(jù)中如何使用k近鄰算法根據(jù)數(shù)據(jù)識(shí)別性別

結(jié)果依然是男的,這個(gè)其實(shí)蠻出乎意料的,因?yàn)閄的衣服數(shù)量挺多的,我們會(huì)在主觀上人為它是一名女生,但實(shí)際上,更加客觀的數(shù)據(jù)告訴我們,它是男生。

上述就是小編為大家分享的大數(shù)據(jù)中如何使用k近鄰算法根據(jù)數(shù)據(jù)識(shí)別性別了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI