最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python機器學(xué)習(xí)之底層實現(xiàn)KNN

 更新時間:2021年06月20日 10:50:29   作者:全村最cool的仔  
今天給大家?guī)淼氖顷P(guān)于Python機器學(xué)習(xí)的相關(guān)知識,文章圍繞著Python底層實現(xiàn)KNN展開,文中有非常詳細的解釋及代碼示例,需要的朋友可以參考下

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

借助python自帶的pandas庫導(dǎo)入數(shù)據(jù),很簡單。用的數(shù)據(jù)是下載到本地的紅酒集。

代碼如下(示例):

import pandas as pd
def read_xlsx(csv_path):
    data = pd.read_csv(csv_path)
    print(data)
    return data

二、歸一化

KNN算法中將用到距離,因此歸一化是一個重要步驟,可以消除數(shù)據(jù)的量綱。我用了歸一化,消除量綱也可以用標(biāo)準化,但是作為新手,我覺得歸一化比較簡單。

其中最大最小值的計算用到了python中的numpy庫,pandas導(dǎo)入的數(shù)據(jù)是DateFrame形式的,np.array()用來將DateFrame形式轉(zhuǎn)化為可以用numpy計算的ndarray形式。

代碼如下(示例):

import numpy as np
def MinMaxScaler(data):
    col = data.shape[1]
    for i in range(0, col-1):
        arr = data.iloc[:, i]
        arr = np.array(arr) #將DataFrame形式轉(zhuǎn)化為ndarray形式,方便后續(xù)用numpy計算
        min = np.min(arr)
        max = np.max(arr)
        arr = (arr-min)/(max-min)
        data.iloc[:, i] = arr
    return data

三、分訓(xùn)練集和測試集

先將數(shù)據(jù)值和標(biāo)簽值分別用x和y劃分開,設(shè)置隨機數(shù)種子random_state,若不設(shè)置,則每次運行的結(jié)果會不相同。test_size表示測試集比例。

def train_test_split(data, test_size=0.2, random_state=None):
    col = data.shape[1]
    x = data.iloc[:, 0:col-1]
    y = data.iloc[:, -1]
    x = np.array(x)
    y = np.array(y)
    # 設(shè)置隨機種子,當(dāng)隨機種子非空時,將鎖定隨機數(shù)
    if random_state:
        np.random.seed(random_state)
        # 將樣本集的索引值進行隨機打亂
        # permutation隨機生成0-len(data)隨機序列
    shuffle_indexs = np.random.permutation(len(x))
    # 提取位于樣本集中20%的那個索引值
    test_size = int(len(x) * test_size)
    # 將隨機打亂的20%的索引值賦值給測試索引
    test_indexs = shuffle_indexs[:test_size]
    # 將隨機打亂的80%的索引值賦值給訓(xùn)練索引
    train_indexs = shuffle_indexs[test_size:]
    # 根據(jù)索引提取訓(xùn)練集和測試集
    x_train = x[train_indexs]
    y_train = y[train_indexs]
    x_test = x[test_indexs]
    y_test = y[test_indexs]
    # 將切分好的數(shù)據(jù)集返回出去
    # print(y_train)
    return x_train, x_test, y_train, y_test

四、計算距離

此處用到歐氏距離,pow()函數(shù)用來計算冪次方。length指屬性值數(shù)量,在計算最近鄰時用到。

def CountDistance(train,test,length):
    distance = 0
    for x in range(length):
        distance += pow(test[x] - train[x], 2)**0.5
    return distance

五、選擇最近鄰

計算測試集中的一條數(shù)據(jù)和訓(xùn)練集中的每一條數(shù)據(jù)的距離,選擇距離最近的k個,以少數(shù)服從多數(shù)原則得出標(biāo)簽值。其中argsort返回的是數(shù)值從小到大的索引值,為了找到對應(yīng)的標(biāo)簽值。

tip:用numpy計算眾數(shù)的方法

import numpy as np
#bincount():統(tǒng)計非負整數(shù)的個數(shù),不能統(tǒng)計浮點數(shù)
counts = np.bincount(nums)
#返回眾數(shù)
np.argmax(counts)

少數(shù)服從多數(shù)原則,計算眾數(shù),返回標(biāo)簽值。

def getNeighbor(x_train,test,y_train,k):
    distance = []
    #測試集的維度
    length = x_train.shape[1]
    #測試集合所有訓(xùn)練集的距離
    for x in range(x_train.shape[0]):
        dist = CountDistance(test, x_train[x], length)
        distance.append(dist)
    distance = np.array(distance)
    #排序
    distanceSort = distance.argsort()
    # distance.sort(key= operator.itemgetter(1))
    # print(len(distance))
    # print(distanceSort[0])
    neighbors =[]
    for x in range(k):
        labels = y_train[distanceSort[x]]
        neighbors.append(labels)
        # print(labels)
    counts = np.bincount(neighbors)
    label = np.argmax(counts)
    # print(label)
    return label

調(diào)用函數(shù)時:

getNeighbor(x_train,x_test[0],y_train,3)

六、計算準確率

用以上KNN算法預(yù)測測試集中每一條數(shù)據(jù)的標(biāo)簽值,存入result數(shù)組,將預(yù)測結(jié)果與真實值比較,計算預(yù)測正確的個數(shù)與總體個數(shù)的比值,即為準確率。

def getAccuracy(x_test,x_train,y_train,y_test):
    result = []
    k = 3
    # arr_label = getNeighbor(x_train, x_test[0], y_train, k)
    for x in range(len(x_test)):
        arr_label = getNeighbor(x_train, x_test[x], y_train, k)
        result.append(arr_label)
    correct = 0
    for x in range(len(y_test)):
        if result[x] == y_test[x]:
           correct += 1
    # print(correct)
    accuracy = (correct / float(len(y_test))) * 100.0
    print("Accuracy:", accuracy, "%")
    return accuracy

總結(jié)

KNN算是機器學(xué)習(xí)中最簡單的算法,實現(xiàn)起來相對簡單,但對于我這樣的新手,還是花費了大半天時間才整出來。

在github上傳了項目:https://github.com/chenyi369/KNN

到此這篇關(guān)于Python機器學(xué)習(xí)之底層實現(xiàn)KNN的文章就介紹到這了,更多相關(guān)Python底層實現(xiàn)KNN內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python使用pywebview開發(fā)桌面應(yīng)用的全過程

    Python使用pywebview開發(fā)桌面應(yīng)用的全過程

    當(dāng)使用桌面應(yīng)用程序的時候,有沒有那么一瞬間,想學(xué)習(xí)一下桌面應(yīng)用程序開發(fā)?下面這篇文章主要給大家介紹了關(guān)于Python使用pywebview開發(fā)桌面應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Python入門教程之運算符與控制流

    Python入門教程之運算符與控制流

    本文主要針對 Python 的運算符和控制流進行講解,這里只介紹 Python 中比較獨特的部分,和其他語言類似的東西,比如加減乘除運算符就不在介紹。由于這篇文章是入門級別的文章,高手可直接跳過。
    2016-08-08
  • 利用Python半自動化生成Nessus報告的方法

    利用Python半自動化生成Nessus報告的方法

    這篇文章主要介紹了利用Python半自動化生成Nessus報告的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • python文件拆分與重組實例

    python文件拆分與重組實例

    今天小編就為大家分享一篇python文件拆分與重組實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python實現(xiàn)控制臺打印的方法

    python實現(xiàn)控制臺打印的方法

    今天小編就為大家分享一篇python實現(xiàn)控制臺打印的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python找出文件中使用率最高的漢字實例詳解

    Python找出文件中使用率最高的漢字實例詳解

    這篇文章主要介紹了Python找出文件中使用率最高的漢字,涉及Python針對字符串與中文的相關(guān)操作技巧,需要的朋友可以參考下
    2015-06-06
  • Python測試框架pytest高階用法全面詳解

    Python測試框架pytest高階用法全面詳解

    這篇文章主要為大家介紹了Python測試框架pytest高階用法全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 詳解Python中通用工具類與異常處理

    詳解Python中通用工具類與異常處理

    在Python開發(fā)中,編寫可重用的工具類和通用的異常處理機制是提高代碼質(zhì)量和開發(fā)效率的關(guān)鍵,本文將介紹如何將特定的異常類改寫為更通用的ValidationException,并創(chuàng)建一個通用的工具類Utils,需要的可以參考下
    2024-12-12
  • 跟老齊學(xué)Python之類的細節(jié)

    跟老齊學(xué)Python之類的細節(jié)

    前面對類的有關(guān)內(nèi)容已經(jīng)描述不少了,其實話題遠遠沒有結(jié)束,不過對于初學(xué)者,掌握這些已經(jīng)算是入門,在以后的實踐中,還需要進行體會和感悟。
    2014-10-10
  • pytest官方文檔解讀fixtures調(diào)用fixtures及fixture復(fù)用性

    pytest官方文檔解讀fixtures調(diào)用fixtures及fixture復(fù)用性

    這篇文章主要為大家介紹了pytest官方文檔解讀fixtures調(diào)用fixtures及fixture復(fù)用性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論

淮滨县| 图木舒克市| 绥芬河市| 长宁区| 颍上县| 略阳县| 时尚| 方城县| 壤塘县| 阜平县| 鄂尔多斯市| 客服| 合肥市| 布尔津县| 隆子县| 彩票| 五莲县| 永寿县| 宁安市| 两当县| 安福县| 洮南市| 广南县| 吐鲁番市| 伽师县| 哈巴河县| 西青区| 增城市| 常州市| 阳谷县| 淮安市| 罗城| 丹凤县| 微山县| 白城市| 淮安市| 临沂市| 彩票| 九江县| 柯坪县| 密云县|