中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

大數據中如何使用k近鄰算法根據數據識別性別

發布時間:2022-01-04 18:18:02 來源:億速云 閱讀:225 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關大數據中如何使用k近鄰算法根據數據識別性別,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

k近鄰算法是最簡單的機器學習算法之一。它可以很方便地用來分類。

需要:

Python環境

訓練集

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

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

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

大數據中如何使用k近鄰算法根據數據識別性別

如X和小麗的距離就是:

大數據中如何使用k近鄰算法根據數據識別性別

求出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))

大數據中如何使用k近鄰算法根據數據識別性別

得到結果為男性,有點出乎意料。

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

所謂的歸一化特征值就是將所有的特征值按照其比重轉化為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))

大數據中如何使用k近鄰算法根據數據識別性別

結果依然是男的,這個其實蠻出乎意料的,因為X的衣服數量挺多的,我們會在主觀上人為它是一名女生,但實際上,更加客觀的數據告訴我們,它是男生

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

句容市| 广汉市| 镇雄县| 东平县| 泰兴市| 教育| 资溪县| 厦门市| 龙山县| 永嘉县| 龙胜| 德清县| 新沂市| 工布江达县| 临朐县| 辽阳市| 稻城县| 玛多县| 西乌珠穆沁旗| 图木舒克市| 资源县| 乐东| 桃园县| 靖江市| 寻乌县| 绥宁县| 古浪县| 镇原县| 蒙自县| 凤冈县| 墨脱县| 西安市| 龙门县| 平和县| 长春市| 边坝县| 福清市| 华蓥市| 蛟河市| 民丰县| 山西省|