【機(jī)器學(xué)習(xí)實(shí)戰(zhàn)】k-近鄰算法

算法基本思想

?????存在一個(gè)樣本數(shù)據(jù)集合,也稱作訓(xùn)練樣本集,并且樣本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽,即我們知道樣本集中每一數(shù)據(jù)與所屬分類的對(duì)應(yīng)關(guān)系。輸入沒(méi)有標(biāo)簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個(gè)特征與樣本集中數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較,然后算法提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的分類標(biāo)簽。一般來(lái)說(shuō),我們只選擇樣本數(shù)據(jù)集中前k個(gè)最相似的數(shù)據(jù),這就是k-近鄰算法中k的出處,通常k是不大于20的整數(shù)。最后,選擇k個(gè)最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類,作為新數(shù)據(jù)的分類。

關(guān)鍵函數(shù)編程實(shí)現(xiàn)

def classify0(inX, dataset, labels, k):
    """
    :param inX: 待分類數(shù)據(jù)
    :param dataset: 分類樣本數(shù)據(jù)
    :param labels: 樣本類別
    :param k: 距離最小的k個(gè)點(diǎn)
    :return: 返回分類分類標(biāo)簽
    """
    # 距離計(jì)算
    datasize = dataset.shape[0]  # 數(shù)據(jù)行數(shù)
    diffMat = tile(inX, (datasize, 1)) - dataset
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()  # 將元素從小到大排列,提取其對(duì)應(yīng)的原來(lái)數(shù)據(jù)的index(索引)

    # 選擇最近的K個(gè)點(diǎn)
    classcount = {}
    for i in range(k):
        voteLabel = labels[sortedDistIndicies[i]]
        classcount[voteLabel] = classcount.get(voteLabel, 0) + 1  # get()如果不存在,返回零值

    # 對(duì)字典進(jìn)行排序
    sortedClassCount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=True)

    return sortedClassCount[0][0]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容