国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

K-NN算法實(shí)操及介紹

這篇具有很好參考價(jià)值的文章主要介紹了K-NN算法實(shí)操及介紹。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一.KNN算法介紹

1.1簡要介紹

在模式識別領(lǐng)域中,最近鄰居法KNN算法,又譯K-近鄰算法)是一種用于分類和回歸的非參數(shù)統(tǒng)計(jì)方法[1],由美國統(tǒng)計(jì)學(xué)家伊芙琳·費(fèi)克斯和小約瑟夫·霍奇斯于1951年首次提出,后來由托馬斯·寇弗擴(kuò)展。在這兩種情況下,輸入包含特征空間中的k個(gè)最接近的訓(xùn)練樣本。

  • k-NN分類中,輸出是一個(gè)分類族群。一個(gè)對象的分類是由其鄰居的“多數(shù)表決”確定的,k個(gè)最近鄰居(k為正整數(shù),通常較?。┲凶畛R姷姆诸悰Q定了賦予該對象的類別。若k?=?1,則該對象的類別直接由最近的一個(gè)節(jié)點(diǎn)賦予。
  • k-NN回歸中,輸出是該對象的屬性值。該值是其k個(gè)最近鄰居的值的平均值。

最近鄰居法采用向量空間模型來分類,概念為相同類別的案例,彼此的相似度高,而可以借由計(jì)算與已知類別案例之相似度,來評估未知類別案例可能的分類。

以上部分來自維基百科,大致意思就是根據(jù)已有數(shù)據(jù)的標(biāo)簽進(jìn)行新數(shù)據(jù)標(biāo)簽的預(yù)測,也就是說,通過一個(gè)人身邊高收入者的數(shù)量判斷這個(gè)人是不是高收入者,一個(gè)人身邊的高收入朋友越多,這個(gè)人就越有可能是高收入者。通過這個(gè)思路,通過了解這個(gè)人身邊富人朋友的數(shù)量是否多到一個(gè)閾值k,我們就可以預(yù)測其是否為富人。而這個(gè)k值,就是該算法的一個(gè)重點(diǎn)。

1.2 算法流程介紹

1.2.1數(shù)據(jù)收集

要進(jìn)行這個(gè)算法的實(shí)現(xiàn),首先需要一定的數(shù)據(jù)的訓(xùn)練和測試以確定預(yù)測正確率最高的k值,所以第一步時(shí)進(jìn)行數(shù)據(jù)的收集,這一步可以通過上網(wǎng)尋找或者通過其他大佬的博客進(jìn)行下載,或者通過調(diào)取python的sklearn庫中的內(nèi)置數(shù)據(jù)集進(jìn)行實(shí)現(xiàn)

1.2.2數(shù)據(jù)處理

這一步需要對已有的數(shù)據(jù)進(jìn)行結(jié)構(gòu)化處理,即對單個(gè)樣本擁有的標(biāo)簽進(jìn)行格式化規(guī)范化,形成表格式的數(shù)據(jù)集。

再之后,還需要對數(shù)據(jù)進(jìn)行歸一化或者賦予比重。因?yàn)椴糠謽颖静煌瑯?biāo)簽下的數(shù)據(jù)完全不成比例,在這種情況下如果完全不對其進(jìn)行處理,那么將會(huì)出現(xiàn)某個(gè)標(biāo)簽在進(jìn)行判斷時(shí)判斷權(quán)重很小甚至完全被忽略的情況。

進(jìn)行歸一化的公式為

K-NN算法實(shí)操及介紹,python

即以該值減去該標(biāo)簽下的最小值除以標(biāo)簽下最大值和最小值的差,將數(shù)據(jù)進(jìn)行該處理后可保證哥哥標(biāo)簽下的范圍為[0,1]。

1.2.3 算法實(shí)施

該算法需要計(jì)算在n維空間中,預(yù)測點(diǎn)與其他已知樣本點(diǎn)的距離,然后選取與之最近的k個(gè)點(diǎn),然后在k個(gè)點(diǎn)中選取出現(xiàn)頻率最高的屬性,并將之作為預(yù)測結(jié)果。

此處的距離可采用歐幾里得距離,公式為

K-NN算法實(shí)操及介紹,python

其中n值為標(biāo)簽數(shù)量,i表示第i個(gè)標(biāo)簽,x和y分別為預(yù)測點(diǎn)和已知樣本點(diǎn)。

二. 實(shí)操

2.1數(shù)據(jù)準(zhǔn)備

本次使用的數(shù)據(jù)為橙子蘋果梨的判斷,每個(gè)樣本點(diǎn)有兩個(gè)標(biāo)簽,分別為直徑和高度,范圍設(shè)置如下表格(范圍為帖主本人瞎編,數(shù)據(jù)集全部為隨機(jī)數(shù)生成,如有雷同純屬巧合)。

K-NN算法實(shí)操及介紹,python

數(shù)據(jù)文本示例如下圖

K-NN算法實(shí)操及介紹,python

此為一部分內(nèi)容,本次實(shí)踐設(shè)置了200個(gè)數(shù)據(jù)樣本作為訓(xùn)練集。

2.2 數(shù)據(jù)導(dǎo)入

首先導(dǎo)入保存于.txt中的數(shù)據(jù),對每行的數(shù)據(jù)進(jìn)行分割,并將前兩項(xiàng)數(shù)據(jù)加入至data_set中,標(biāo)簽存入lables中。

def createDataSet(filename):
    data_set = []  # 保存數(shù)據(jù)
    data_labels = []  # 保存標(biāo)簽
    with open(filename, 'r', encoding='utf-8') as file:
        for line in file:
            d, h, name = line.strip().split(',')
            data_set.append([int(d), int(h)])
            data_labels.append(name)
    return np.array(data_set), data_labels

2.3 數(shù)據(jù)歸一化

在這段函數(shù)中通過numpy庫的內(nèi)置函數(shù)找到訓(xùn)練集中的最大最小值并依照上面給出的公式進(jìn)行處理,最后返回處理過的數(shù)據(jù)。

def normalize(dataset, mydata):
    mindata = np.min(dataset, axis=0)  # axis=0按行進(jìn)行比較
    maxdata = np.max(dataset, axis=0)
    my_data = (mydata - mindata) / (maxdata - mindata)
    data_set = (dataset - mindata) / (maxdata - mindata)
    return data_set, my_data

2.4 knn算法主體部分

在這段函數(shù)中,通過.shape[0]獲取data_set的行數(shù),再通過numpy庫中的tile函數(shù),根據(jù)mydata生成一個(gè)與data_set行數(shù)相同的矩陣并與data_set進(jìn)行計(jì)算,獲取平方后再使用.sum方法,獲取平方后的各個(gè)值的和,再依據(jù)和的大小按從小到大的順序進(jìn)行排列。

完成排列后的列表中,依次選取k個(gè)值并獲取其數(shù)目最大的標(biāo)簽并且返回。

def knn(data_set, data_labels, k, mydata):
    data_size = data_set.shape[0]
    temp_distance = (np.tile(mydata, (data_size, 1)) - data_set) ** 2
    distances = temp_distance.sum(axis=1) ** 0.5
    sorted_distances_indices = distances.argsort()
    data_dict = {}
    for i in range(k):
        data_label = data_labels[sorted_distances_indices[i]]
        data_dict[data_label] = data_dict.get(data_label, 0) + 1
    sort_dict = sorted(data_dict.items(), key=operator.itemgetter(1), reverse=True)
    return sort_dict[0][0]

2.5 測試集的驗(yàn)證及k值的選取

knn算法的一個(gè)重點(diǎn)就是k值的選取,這個(gè)值的選取應(yīng)該通過驗(yàn)證來選取,因此,在這次實(shí)操中加載了一個(gè)含有100組數(shù)據(jù)的測試集,依次測試k的值不同時(shí)得到的正確率有多高,最后打印折線圖并且返回最佳的k

def find_k():
    # 獲取數(shù)據(jù)集以及標(biāo)簽
    data_set, data_labels = createDataSet("fruit_data.txt")
    test_set, test_labels = createDataSet("fruit_2.txt")

    # 初始化準(zhǔn)確率列表
    accuracy_list = []

    # 遍歷 k 值從 1 到 30
    for k in range(1, 31):
        correct_count = 0
        # 遍歷測試集
        for i in range(len(test_set)):
            # 進(jìn)行歸一化
            set_data, test_data = normalize(data_set, test_set[i])
            # 使用 KNN 算法進(jìn)行預(yù)測
            predicted_label = knn(set_data, data_labels, k, test_data)
            # 比較預(yù)測結(jié)果與實(shí)際標(biāo)簽
            if predicted_label == test_labels[i]:
                correct_count += 1
        # 計(jì)算準(zhǔn)確率
        accuracy = correct_count / len(test_set)
        accuracy_list.append(accuracy)

    # 繪制準(zhǔn)確率隨 k 值變化的折線圖
    plt.plot(range(1, 31), accuracy_list, marker='o', linestyle='-', color='blue', label='Accuracy')
    plt.xlabel('k')
    plt.ylabel("accuracy")
    plt.title("result")
    plt.legend()
    plt.grid(True)
    plt.show()

    # 找出最優(yōu)的 k 值
    max_accuracy = max(accuracy_list)
    optimal_k = accuracy_list.index(max_accuracy) + 1
    print(f"Best value of k: {optimal_k} with an accuracy of {max_accuracy:.2f}")
    return optimal_k

最后得到的折線圖和結(jié)果如下

K-NN算法實(shí)操及介紹,python

K-NN算法實(shí)操及介紹,python

2.6主函數(shù)

依據(jù)find_k函數(shù)找到k值,再根據(jù)讀入的數(shù)據(jù)進(jìn)行判斷即可

def main():
    # 獲取數(shù)據(jù)集以及標(biāo)簽
    data_set, data_labels = createDataSet("fruit_data.txt")
    my_test = [int(input("請輸入待分類水果的直徑:\n")), int(input("請輸入待分類水果的高:\n"))]
    # 進(jìn)行歸一化
    k = find_k()
    set_data, test_data = normalize(data_set, my_test)
    print('輸入的數(shù)據(jù)所對應(yīng)的水果類別是:{}'.format(knn(set_data, data_labels, k, test_data)))

結(jié)果圖如下

K-NN算法實(shí)操及介紹,python

三.總結(jié)

本次實(shí)踐對knn算法有了一定的理解

首先其核心內(nèi)容易理解,思想較為簡單,但由于每次運(yùn)算都需要跑完全部的數(shù)據(jù)集,因而計(jì)算量較大,較為花費(fèi)時(shí)間。而當(dāng)k值選取有誤時(shí)容易出現(xiàn)過擬合現(xiàn)象。

作為本學(xué)期的第一個(gè)實(shí)驗(yàn),完整順下來之后對于python的函數(shù)等內(nèi)容有了一定的了解,但在編碼能力上還有欠缺,多多學(xué)習(xí)吧文章來源地址http://www.zghlxwxcb.cn/news/detail-844907.html

到了這里,關(guān)于K-NN算法實(shí)操及介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 神經(jīng)網(wǎng)絡(luò)(NN)網(wǎng)絡(luò)構(gòu)建及模型算法介紹

    神經(jīng)網(wǎng)絡(luò)最主要的作用是作為提取特征的工具,最終的分類并不是作為主要核心。 人工神經(jīng)網(wǎng)絡(luò)也稱為多層感知機(jī),相當(dāng)于將輸入數(shù)據(jù)通過前面多個(gè)全連接層網(wǎng)絡(luò)將原輸入特征進(jìn)行了一個(gè)非線性變換,將變換后的特征拿到最后一層的分類器去分類。 神經(jīng)網(wǎng)絡(luò)是由多個(gè)神經(jīng)元

    2024年02月04日
    瀏覽(15)
  • python實(shí)操之網(wǎng)絡(luò)爬蟲介紹

    python實(shí)操之網(wǎng)絡(luò)爬蟲介紹

    網(wǎng)絡(luò)爬蟲,也可以叫做網(wǎng)絡(luò)數(shù)據(jù)采集更容易理解。它是指通過編程向網(wǎng)絡(luò)服務(wù)器(web)請求數(shù)據(jù)(HTML表單),然后解析HTML,提取出自己想要的數(shù)據(jù)。 它包括了根據(jù)url獲取HTML數(shù)據(jù)、解析HTML,獲取目標(biāo)信息、存儲數(shù)據(jù)幾個(gè)步驟;過程中可能會(huì)涉及到數(shù)據(jù)庫、網(wǎng)絡(luò)服務(wù)器、HTTP協(xié)

    2024年01月21日
    瀏覽(23)
  • pytorch容器之nn.Sequential, nn.ModuleList, nn.ModuleDict介紹

    ??在深度學(xué)習(xí)模型創(chuàng)建的時(shí)候,我們經(jīng)常會(huì)碰到 nn.Sequential , nn.ModuleList , nn.ModuleDict 這三個(gè)東西,尤其是在遷移學(xué)習(xí)訓(xùn)練的時(shí)候經(jīng)常碰到,他們到底是什么,怎么用的,使用的時(shí)候有哪些注意事項(xiàng),通過這篇博文淺記一下。 ??在介紹這三個(gè)容器之前,我們需要先知道什么

    2024年02月08日
    瀏覽(21)
  • 【PyTorch API】 nn.RNN 和 nn.LSTM 介紹和代碼詳解

    【PyTorch API】 nn.RNN 和 nn.LSTM 介紹和代碼詳解

    torch.nn.RNN 的 PyTorch 鏈接:torch.nn.RNN(*args, **kwargs) nn.RNN 的用法和輸入輸出參數(shù)的介紹直接看代碼: 需要特別注意的是 nn.RNN 的第二個(gè)輸出 hn 表示所有掩藏層的在最后一個(gè) time step 隱狀態(tài),聽起來很難理解,看下面的紅色方框內(nèi)的數(shù)據(jù)就懂了。即 output[:, -1, :] = hn[-1, : , :] 這里

    2024年02月12日
    瀏覽(25)
  • torch.nn.BCEWithLogitsLoss用法介紹

    torch.nn.BCEWithLogitsLoss用法介紹

    self.bce = nn.BCEWithLogitsLoss(reduction=\\\'none\\\') , None的使用方法可以見官網(wǎng)pytorch代碼文檔 代碼舉例 舉例的代碼中target中的計(jì)算方法是這樣的( resuction=\\\'none\\\' ) 對于target[0][0][0]=1=y n , a[0][0][0]=0.2070=x n , 因此,對于l n 0.5950 = ? ( 1 × ln ? σ ( 0.2070 ) + 0 × ln ? ( 1 ? σ ( 0.2070 ) ) ) 0.5950 = -l

    2024年01月18日
    瀏覽(24)
  • 深度學(xué)習(xí)之pytorch 中 torch.nn介紹

    pytorch 中必用的包就是 torch.nn,torch.nn 中按照功能分,主要如下有幾類: 1. Layers(層):包括全連接層、卷積層、池化層等。 2. Activation Functions(激活函數(shù)):包括ReLU、Sigmoid、Tanh等。 3. Loss Functions(損失函數(shù)):包括交叉熵?fù)p失、均方誤差等。 4. Optimizers(優(yōu)化器):包括

    2024年02月22日
    瀏覽(27)
  • 【torch.nn.Sequential】序列容器的介紹和使用

    【torch.nn.Sequential】序列容器的介紹和使用

    nn.Sequential是一個(gè)有序的容器,該類將按照傳入構(gòu)造器的順序,依次創(chuàng)建相應(yīng)的函數(shù),并記錄在Sequential類對象的數(shù)據(jù)結(jié)構(gòu)中,同時(shí)以神經(jīng)網(wǎng)絡(luò)模塊為元素的有序字典也可以作為傳入?yún)?shù)。 因此,Sequential可以看成是有多個(gè)函數(shù)運(yùn)算對象,串聯(lián)成的神經(jīng)網(wǎng)絡(luò),其返回的是Module類型

    2024年02月04日
    瀏覽(31)
  • pytorch中nn.Conv1d功能介紹

    pytorch中nn.Conv1d功能介紹

    ??????? 在使用Conv1d函數(shù)時(shí),pytorch默認(rèn)你的數(shù)據(jù)是一維的,比如一句話“深度學(xué)習(xí)”可以用一個(gè)一維數(shù)組 [\\\'深\\\', \\\'度\\\', \\\'學(xué)\\\', \\\'習(xí)\\\'] 表示,這個(gè)數(shù)據(jù)就是一維的。圖片是二維數(shù)據(jù),它有長寬兩個(gè)維度。 ??????? 因此在使用 Conv1d 函數(shù)時(shí),輸入是一個(gè)三位數(shù)組,三個(gè)維度分別表

    2024年02月10日
    瀏覽(19)
  • OpenFeign的簡單介紹和功能實(shí)操

    OpenFeign的簡單介紹和功能實(shí)操

    本文主要做一下OpenFeign的簡單介紹和功能實(shí)操,實(shí)操主要是OpenFeign的超時(shí)和重試,在閱讀本文章前,請完成《Nacos 注冊中心介紹與實(shí)操》內(nèi)的Nacos多模塊生產(chǎn)消費(fèi)者項(xiàng)目 OpenFeign全名Spring Cloud OpenFeign,是SpringCloud開發(fā)團(tuán)隊(duì)基于Feign開發(fā)的框架,聲明式Web服務(wù)客戶端 Feign是一種聲

    2024年02月06日
    瀏覽(22)
  • Pytorch學(xué)習(xí)筆記(5):torch.nn---網(wǎng)絡(luò)層介紹(卷積層、池化層、線性層、激活函數(shù)層)

    Pytorch學(xué)習(xí)筆記(5):torch.nn---網(wǎng)絡(luò)層介紹(卷積層、池化層、線性層、激活函數(shù)層)

    ?一、卷積層—Convolution Layers ?1.1?1d / 2d / 3d卷積 1.2 卷積—nn.Conv2d() nn.Conv2d 1.3?轉(zhuǎn)置卷積—nn.ConvTranspose nn.ConvTranspose2d ?二、池化層—Pooling Layer (1)nn.MaxPool2d (2)nn.AvgPool2d (3)nn.MaxUnpool2d ?三、線性層—Linear Layer ?nn.Linear ?四、激活函數(shù)層—Activate Layer (1)nn.Sigmoid ?(

    2024年01月20日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包