您好,登錄后才能下訂單哦!
這期內(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í)間長度 性別是 小麗 40 30 女 小明 18 10 男 小蓉 32 34 女 小王 23 17 男 小方 26 7 男 小敏 38 23 女 X 35 15 ?
我們要使用k近鄰算法求出X的性別,就是用X的特征值算出與其他人的特征值的距離,當(dāng)然,我們還需要考慮數(shù)值問題,數(shù)值大的變量對(duì)結(jié)果的影響也大了,像這里,衣服的數(shù)量總體比打扮時(shí)間長度多,對(duì)結(jié)果的影響也更大,但實(shí)際上不應(yīng)該如此。這個(gè)我們到后面再講解如何進(jìn)行處理,公式如下(歐式公式):
如X和小麗的距離就是:
求出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))
得到結(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))
結(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è)資訊頻道。
免責(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)容。