您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關大數據中如何使用k近鄰算法根據數據識別性別,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
k近鄰算法是最簡單的機器學習算法之一。它可以很方便地用來分類。
需要:
Python環境
訓練集
k近鄰算法其實就是算不同的特征值之間的距離然后進行分類,語言描述太抽象,下面我舉個例子(求X的性別):
名字 擁有衣服的數量 每天化妝打扮的時間長度 性別是 小麗 40 30 女 小明 18 10 男 小蓉 32 34 女 小王 23 17 男 小方 26 7 男 小敏 38 23 女 X 35 15 ?
我們要使用k近鄰算法求出X的性別,就是用X的特征值算出與其他人的特征值的距離,當然,我們還需要考慮數值問題,數值大的變量對結果的影響也大了,像這里,衣服的數量總體比打扮時間長度多,對結果的影響也更大,但實際上不應該如此。這個我們到后面再講解如何進行處理,公式如下(歐式公式):
如X和小麗的距離就是:
求出X和所有人的距離后,取最短距離的前k個人的性別,在這k個人中,出現最多次的那個性別,就是X的性別。
這里的k就是這個算法名字的由來,k是可以自取的,隨著樣本數量的增加應該適時調整。
首先先構造這個算法的函數:
def classify(X,dataSet,labels,k):
#X是待測對象的特征值矩陣,dataSet是樣本,labels是要分類的特征
dataSetSize = dataSet.shape[0]
#求矩陣長度
minusMat = tile(X,(dataSetSize,1)) - dataSet
#進行減法(tile就是重復(x,y)次X)
sqMinusMat = minusMat ** 2
#平方
sqDistances = sqMinusMat.sum(axis=1)
#相加,axis=1就是每一行內相加
distances = sqDistances ** 0.5
#歐式公式開根
sortedDistIndicies = distances.argsort()
#返回數組中距離從小到大的數據的索引
classCount = {}
#字典,準備計數
for i in range(k):
#執行k次
votelabels = labels[sortedDistIndicies[i]]
classCount[votelabels] = classCount.get(votelabels,0) + 1
#尋找存不存在這個符號,不存在則返回默認0,然后加一
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse = True)
# classCount.items() 對這個字典里的對象
# reverse = True 降序
# key=operator.itemgetter(1) 根據第一個數值比較 如 'B':2 中的2
return sortedClassCount[0][0]
# 返回出現次數最多的項目
下面我們就用這個函數來識別一下X的性別。
先把樣本集創建出來:
def createDataSet():
group = array([[40,30],[18,10],[32,34],[23,17],[26,7],[38,23]])
labels = ['女','男','女','男','男','女']
return group,labels
寫出X的數據,并將樣本集和數據傳入函數后運行:
X = [35,15]
group,labels = createDataSet()
print(classify(X,group,labels,3))
得到結果為男性,有點出乎意料。
但是我們還沒有處理權重問題,之前就提到了,擁有衣服的數量和每天化妝打扮的時間長度所占權重是不一樣的。于是我們需要歸一化特征值。
所謂的歸一化特征值就是將所有的特征值按照其比重轉化為0到1之間的值(有點像S函數)。算法是這樣的:
newValue = (oldValue - min) / (max - min)
轉換為函數:
def balance(X,dataSet):
min = dataSet.min(0)
max = dataSet.max(0)
#取得兩列的最小最大值
ranges = max - min
#取得范圍
normDataSet = zeros(shape(dataSet))
#創建一個同等大小值為零的矩陣
m = dataSet.shape[0]
#取得列的長度
normDataSet = dataSet - tile(min,(m,1))
#oldValue - min
normDataSet = normDataSet/tile(ranges,(m,1))
#(oldValue - min) / (max - min)
#下面計算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 ]]
而訓練集是:
[[ 1. 0.85185185]
[ 0. 0.11111111]
[ 0.63636364 1. ]
[ 0.22727273 0.37037037]
[ 0.36363636 0. ]
[ 0.90909091 0.59259259]]
顯然,這樣的標準更加科學,不會因為某些數字大而影響變量之間的權重。
重新計算:
X = [35,15]
group,labels = createDataSet()
group,X = balance(X,group)
print(X)
print(group)
print(classify(X,group,labels,3))
結果依然是男的,這個其實蠻出乎意料的,因為X的衣服數量挺多的,我們會在主觀上人為它是一名女生,但實際上,更加客觀的數據告訴我們,它是男生。
上述就是小編為大家分享的大數據中如何使用k近鄰算法根據數據識別性別了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。