成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

機(jī)器學(xué)習(xí)1——k近鄰算法

seanlook / 1933人閱讀

k近鄰(k-Nearest Neighbor,kNN)算法是經(jīng)典的帶監(jiān)督的分類算法,核心思想是如果一個(gè)樣本在特征空間中的k個(gè)最相鄰的樣本中的大多數(shù)屬于某一個(gè)類別,則針對(duì)該樣本的劃分結(jié)果也屬于這個(gè)類別。
1. 算法步驟

準(zhǔn)備訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù);

確定參數(shù) k;

計(jì)算測試數(shù)據(jù)與各個(gè)訓(xùn)練數(shù)據(jù)之間的距離,距離的遞增關(guān)系進(jìn)行排序;

選取距離最小的 k 個(gè)點(diǎn);

確定前 k 個(gè)點(diǎn)所在類別的出現(xiàn)頻率;

返回前 k 個(gè)點(diǎn)中出現(xiàn)頻率最高的類別作為測試數(shù)據(jù)的預(yù)測分類。

2. Python代碼實(shí)現(xiàn)kNN 2.1 算法實(shí)現(xiàn)
# python 3.7.2

from numpy import *
import operator

def kNNClassify(testData, trainData, labels, k):
    dataSize = trainData.shape[0]  # 測試數(shù)據(jù)矩陣的行數(shù),4
    diffMat = tile(testData, (dataSize, 1)) - trainData  # numpy中的tile用于重復(fù)矩陣中的元素,構(gòu)造和dataSize規(guī)格一樣
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis=1)  # 計(jì)算矩陣的行和
    distances = sqDistances ** 0.5  # 采用歐式距離計(jì)算
    sortedDisindexes = distances.argsort()  # 返回排序后對(duì)應(yīng)的索引數(shù)據(jù)
    classCount = {}
    for i in range(k):
        voteLabel = labels[sortedDisindexes[i]]
        classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  # 根據(jù)第2維進(jìn)行排序
    return sortedClassCount[0][0]
    

假設(shè)訓(xùn)練數(shù)據(jù)為:

trainData= [[1, 1.1], [1, 1], [0, 0], [0, 0.1]]
labels = ["A", "A", "B", "B"]

測試數(shù)據(jù)為:

testData = [[1.1 , 1], [0.1, 0]]
2.2 實(shí)戰(zhàn):約會(huì)網(wǎng)站對(duì)象匹配

小明在某約會(huì)網(wǎng)站上瀏覽妹子,對(duì)看到的每一個(gè)妹子進(jìn)行評(píng)價(jià):largeDoses,smallDoses,didntLike,評(píng)價(jià)的依據(jù)有3條:

每年旅行里程數(shù)

玩游戲占一天時(shí)間比重

每周吃的甜品數(shù)量

收集了1000條相關(guān)數(shù)據(jù),存儲(chǔ)在datingTestSet.txt文件中

40920    8.326976    0.953952    largeDoses
14488    7.153469    1.673904    smallDoses
26052    1.441871    0.805124    didntLike
75136    13.147394    0.428964    didntLike
38344    1.669788    0.134296    didntLike
72993    10.141740    1.032955    didntLike
35948    6.830792    1.213192    largeDoses
42666    13.276369    0.543880    largeDoses
67497    8.631577    0.749278    didntLike
35483    12.273169    1.508053    largeDoses
50242    3.723498    0.831917    didntLike
63275    8.385879    1.669485    didntLike
5569    4.875435    0.728658    smallDoses
51052    4.680098    0.625224    didntLike
...
2.2.1 讀取文本文件數(shù)據(jù),構(gòu)造矩陣
def file2Matrix(filename):
    love_dictionary = {"largeDoses": 1, "smallDoses": 0, "didntLike": -1}
    fr = open("datingTestSet.txt")
    arrayOfLines = fr.readlines()
    numOfLines = len(arrayOfLines)
    dataMatrix = zeros((numOfLines, 3))  # 數(shù)據(jù)矩陣
    classLabels = []  # 標(biāo)簽數(shù)組
    index = 0
    for line in arrayOfLines:
        line = line.strip()
        listFromLine = line.split("	")
        dataMatrix [index, :] = listFromLine[0:3]
        classLabels.append(love_dictionary.get(listFromLine[-1]))
        index += 1
    return returnMat, classLabels
2.2.2 數(shù)據(jù)歸一化處理

各個(gè)維度的數(shù)值差異較大,直接使用會(huì)嚴(yán)重影響分類效果,因此需要進(jìn)行歸一化處理:
newValue = (oldVlue -min) / (max - min)

def autoNorm(dataSet):
    minVals = dataSet.min(0)  # min(0)返回列的最小值, min(1)返回行的最小值
    maxVals = dataSet.max(0)  # max(0)返回列的最大值, max(1)返回行的最大值
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet))
    m = normDataSet.shape[0]
    normDataSet = dataSet - tile(minVals, (m, 1))
    normDataSet = normDataSet / tile(ranges, (m, 1))
    return normDataSet 

最后調(diào)用kNNClassify函數(shù)進(jìn)行測試。此處省略

3. 算法優(yōu)缺點(diǎn) 3.1 優(yōu)點(diǎn)

簡單,易于理解,易于實(shí)現(xiàn);

適合數(shù)值型屬性分類;

適合于多分類問題(multi-modal,對(duì)象具有多個(gè)類別標(biāo)簽), kNN比SVM的表現(xiàn)要好。

3.2 缺點(diǎn)

當(dāng)樣本不平衡時(shí),如一個(gè)類的樣本容量很大,而其他類樣本容量很小時(shí),有可能導(dǎo)致當(dāng)輸入一個(gè)新樣本時(shí),該樣本的k個(gè)鄰居中大容量類的樣本占多數(shù),分類出現(xiàn)偏差。

計(jì)算量較大,每一個(gè)待分類的文本都要計(jì)算它到全體已知樣本的距離。

4. 改進(jìn)策略

改進(jìn)策略主要分成了分類效率分類效果兩個(gè)方向:

分類效率:事先對(duì)樣本屬性進(jìn)行約簡,刪除對(duì)分類結(jié)果影響較小的屬性。該算法比較適用于樣本容量比較大的類域的自動(dòng)分類,而那些樣本容量較小的類域采用這種算法比較容易產(chǎn)生誤分。

分類效果:① 采用權(quán)值的方法(和該樣本距離小的鄰居權(quán)值大)來改進(jìn),如可調(diào)整權(quán)重的k最近鄰居法WAkNN (weighted adjusted k nearest neighbor);② 依照訓(xùn)練集合中各種分類的文件數(shù)量,選取不同數(shù)目的最近鄰居,來參與分類;③ 類中心算法,求出各個(gè)樣本的類中心到測試數(shù)據(jù)的距離,劃分到最近的類。

參考資料

《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43672.html

相關(guān)文章

  • 如何用機(jī)器學(xué)習(xí)算法來進(jìn)行電影分類?(含Python代碼)

    摘要:電影分析近鄰算法周末,小迪與女朋友小西走出電影院,回味著剛剛看過的電影。近鄰分類電影類型小迪回到家,打開電腦,想實(shí)現(xiàn)一個(gè)分類電影的案例。分類器并不會(huì)得到百分百正確的結(jié)果,我們可以使用很多種方法來驗(yàn)證分類器的準(zhǔn)確率。 電影分析——K近鄰算法 周末,小迪與女朋友小西走出電影院,回味著剛剛看過的電影。 小迪:剛剛的電影很精彩,打斗場景非常真實(shí),又是一部優(yōu)秀的動(dòng)作片! 小西:是嗎?我怎么感覺這...

    animabear 評(píng)論0 收藏0
  • 機(jī)器學(xué)習(xí)實(shí)戰(zhàn) Task1】 (KNN)k近鄰算法的應(yīng)用

    摘要:背景近鄰算法的概述近鄰算法的簡介近鄰算法是屬于一個(gè)非常有效且易于掌握的機(jī)器學(xué)習(xí)算法,簡單的說就是采用測量不同特征值之間距離的方法對(duì)數(shù)據(jù)進(jìn)行分類的一個(gè)算法。完美的分類器的錯(cuò)誤率為,而最差的分類器的錯(cuò)誤率則為。 1 背景 1.1 k近鄰算法的概述 (1)k近鄰算法的簡介 k-近鄰算法是屬于一個(gè)非...

    toddmark 評(píng)論0 收藏0
  • 機(jī)器學(xué)習(xí)(六)-基于KNN分類算法的自動(dòng)劃分電影的題材類型實(shí)現(xiàn)

    摘要:算法及工作原理近鄰算法采用測量不同特征值之間的距離方法進(jìn)行分類。最后選擇個(gè)最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類作為新數(shù)據(jù)的分類。 1 分類算法引言 眾所周知,電影可以按照題材分類,然而題材本身是如何定義的?由誰來判定某部電影屬于哪個(gè)題材?也就是說同一題材的電影具有哪些公共特征?這些都是在進(jìn)行電影分類時(shí)必須要考慮的問題。 動(dòng)作片中也會(huì)存在接吻鏡頭,愛情片中也會(huì)存在打斗場景,我們不能單純依靠是...

    MkkHou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

seanlook

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<