亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

機器學習——K近鄰算法

SexySix / 1695人閱讀

摘要:而代碼是給出現(xiàn)情況增加次數(shù),出現(xiàn)一次排序導入運算符模塊的方法,按照第二個元素的次序對元組進行排序,此處的排序為逆序。

機器學習——K近鄰算法 概述

k近鄰是一種基本分類與回歸方法.

輸入:特征向量

輸出:實例的類別(可取多類)

核心思想:如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別,并具有這個類別上樣本的特性.

優(yōu)點:計算精度高、對異常值不敏感、無數(shù)據(jù)輸入假定

缺點:計算復雜度高、空間復雜度高

適用范圍:數(shù)值型和標稱型

算法流程

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

準備數(shù)據(jù):距離計算所需要的數(shù)值,最好是結構化的數(shù)據(jù)格式

分析數(shù)據(jù):可以適用任何方法

訓練算法:此步驟不適用于KNN

測試算法:計算錯誤率

使用算法:首先需要輸入樣本數(shù)據(jù)和結構化的輸出結果,然后運行k-近鄰算法判定輸入數(shù)據(jù)分別屬于哪個分類,最后應用對計算出的分類執(zhí)行后續(xù)的處理

kNN算法
構造數(shù)據(jù)集
import numpy as np

def create_data_set():
    """構造數(shù)據(jù)集"""
    group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    label = ["A", "A", "B", "B"]
    return group, label
生成數(shù)據(jù)集
group, label = create_data_set()
實現(xiàn)kNN算法偽代碼

對未知類別屬性的數(shù)據(jù)集種的每個點依次執(zhí)行以下步驟:

1. 計算已知類別屬性的數(shù)據(jù)集中的每個點與當前點之間的距離

2. 按照距離遞增次序排序

3. 選取與當前點距離最小的k個點

4. 確定前k個點所在類別的出現(xiàn)頻率

5. 返回前k個點出現(xiàn)頻率最高的類別作為當前點的預測分類
?

import operator

def classify0(inX, data_set, label, k):
    """
    KNN算法
    :param inX: 用于分類的輸入向量
    :param data_set: 訓練樣本集
    :param label: 訓練標簽向量
    :param k: 選取最近鄰居的數(shù)量
    :return: k個鄰居里頻率最高的分類
    """

    """距離計算"""
    # 獲得樣本量
    data_set_size = data_set.shape[0]
    # tile:在行方向重復inX,dataSetSize次,在列方向上重復inX,1次
    diff_mat = np.tile(inX, (data_set_size, 1)) - data_set
    # 離原點的距離,相見后平方
    sq_diff_mat = diff_mat ** 2
    # x軸和y軸差的平方和
    sq_distances = sq_diff_mat.sum(axis=1)
    # 然后開方
    distances = sq_distances ** 0.5
    # argsort函數(shù)返回的是數(shù)組值從小到大的索引值
    sorted_distance_index = distances.argsort()
    class_count = {}
    """選擇距離最小的點"""
    for i in range(k):
        # 返回距離最近的第i個樣本所對應的標簽
        vote_label = label[sorted_distance_index[i]]
        # print(voteIlabel)
        # print(classCount.get(voteIlabel, 0))
        # 這里的0是設置默認值為0,而代替None。而代碼是給出現(xiàn)情況增加次數(shù),出現(xiàn)一次+1
        class_count[vote_label] = class_count.get(vote_label, 0) + 1
        # print(classCount)
    """排序"""
    # 導入運算符模塊的itemgetter方法,按照第二個元素的次序對元組進行排序,此處的排序為逆序。
    sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
    # 返回頻率最大的Label
    return sorted_class_count[0][0]
添加算法測試代碼
classify0([0, 0], group, label, k=3)
約會網(wǎng)站示例
加載并解析數(shù)據(jù)
# 將文本記錄轉換為numpy的解析程序
def file2matrix(filename):
    fr = open(filename)
    # readlines把文件所有內容讀取出來,組成一個列表,其中一行為一個元素
    array_of_lines = fr.readlines()
    number_of_lines = len(array_of_lines)
    # 返回一個用1000行每行3個0填充的數(shù)組,形成特征矩陣
    return_mat = np.zeros((number_of_lines, 3))
    class_label_vector = []
    for index, line in enumerate(array_of_lines):
        # 去除每行前后的空格
        line = line.strip()
        # 根據(jù)	把每行分隔成由四個元素組成的列表
        list_from_line = line.split("	")
        # 選取前3個元素,將它們按順序存儲到特征矩陣中
        return_mat[index, :] = list_from_line[0: 3]
        # 將列表的最后一個元素儲存到class_label_vector中去,儲存的元素值為整型
        class_label_vector.append(int(list_from_line[-1]))
    return return_mat, class_label_vector
獲得解析數(shù)據(jù)
dating_data_mat, dating_labels = file2matrix("datingTestSet2.txt")
使用Matplotlib創(chuàng)建散點圖
import matplotlib.pyplot as plt

# 創(chuàng)建Figure實例
fig = plt.figure()
# 添加一個子圖,返回Axes實例
ax = fig.add_subplot(111)  # 選取最近鄰居的數(shù)量
# 生成散點圖,x軸使用dating_data_mat第二列數(shù)據(jù),y軸使用dating_data_mat的第三列數(shù)據(jù)
# ax.scatter(x=dating_data_mat[:, 1], y=dating_data_mat[:, 2])
# 個性化標記散點圖,形狀(s)和顏色(c)
ax.scatter(x=dating_data_mat[:, 1], y=dating_data_mat[:, 2], s=15.0 * np.array(dating_labels), c=np.array(dating_labels))
plt.show()
歸一化特征值

newValue=(oldValue?min)/(max?min)

def auto_num(data_set):
    """
    歸一化特征值
    :param data_set: 數(shù)據(jù)集
    :return 歸一化后的數(shù)據(jù)集, 列的差值范圍, 列的最小值
    """
    # 列的最小值
    min_val = data_set.min()
    # 列的最大值
    max_val = data_set.max()
    # 列的差值范圍
    range_s = max_val - min_val
    # 構造返回矩陣
    norm_data_set = np.zeros(shape=np.shape(data_set))
    # m = data_set.shape[0]
    # oldValue - min
    norm_data_set = data_set - np.tile(min_val, (data_set.shape[0], 1))
    # (oldValue - min) / (max - min)
    norm_data_set = norm_data_set / np.tile(range_s, (data_set.shape[0], 1))
    return norm_data_set, range_s, min_val
歸一化測試
normalize_data_set, ranges, min_val = auto_num(dating_data_mat)
print(normalize_data_set)
測試算法
def dating_class_test():
    # 選擇測試數(shù)據(jù)量
    ho_ratio = 0.10
    # 解析數(shù)據(jù)
    dating_data_mat, dating_labels = file2matrix("datingTestSet2.txt")
    # 歸一化數(shù)據(jù)
    norm_mat, range_s, min_val = auto_num(dating_data_mat)
    # 拆分10%數(shù)據(jù)作為測試數(shù)據(jù)
    m = norm_mat.shape[0]  # 總數(shù)據(jù)量
    num_test_vec = int(m * ho_ratio)  # 測試數(shù)據(jù)量
    # 錯誤樣本計數(shù)
    error_count = 0.0
    # 對測試數(shù)據(jù)進行分類,并對比檢驗結果正確率
    for i in range(num_test_vec):
        classifier_result = classify0(  # classifier_result : k個鄰居里頻率最高的分類
            norm_mat[i, :],  # 用于分類的輸入向量(測試數(shù)據(jù), : 表示一行內所有元素)
            norm_mat[num_test_vec: m, :],  # 訓練樣本集(從測試的數(shù)據(jù)開始到總數(shù)據(jù)量結束)
            dating_labels[num_test_vec:m],  # 訓練標簽向量(從測試的數(shù)據(jù)開始到總數(shù)據(jù)量結束)
            3  # 選取最近鄰居的數(shù)量
        )
        print("the classifier came back with: %d, the real answer is: %d" % (classifier_result, dating_labels[i]))
        if classifier_result != dating_labels[i]:
            error_count += 1.0
    print("the total error rate is: %f" % (error_count / float(num_test_vec)))
執(zhí)行測試
dating_class_test()
使用算法
def classify_person():
    """
    根據(jù)輸入指標,通過分類器進行預測喜歡程度
    :return:
    """
    result_list = ["not at all", "in small doses", "in large doses"]
    percent_tats = float(input("percentage of time spent playing vedio games?"))
    ff_miles = float(input("frequent flier miles earned per year?"))
    ice_cream = float(input("liters of ice cream consumed per year?"))
    dating_data, dating_labels = file2matrix("datingTestSet2.txt")
    normalize_matrix, ranges, min_val = auto_num(dating_data)
    # 將輸入指標,歸一化后代入分類器進行預測
    in_arr = np.array([ff_miles, percent_tats, ice_cream])
    print(in_arr, min_val, ranges, (in_arr-min_val)/ranges)
    print(ranges)
    classifier_result = classify0((in_arr-min_val)/ranges, normalize_matrix, dating_labels, 3)
    print("You will probably like this person: ", result_list[classifier_result - 1])
執(zhí)行函數(shù)
classify_person()
輸出
percentage of time spent playing vedio games?20
frequent flier miles earned per year?299
liters of ice cream consumed per year?1
You will probably like this person:  in large doses
sklearn中實現(xiàn)
from sklearn import neighbors

def knn_classify_person():
    """
        根據(jù)輸入指標,通過分類器進行預測喜歡程度
    :return:
    """
    result_list = np.array(["not at all", "in small doses", "in large doses"])
    percent_tats = float(input("percentage of time spent playing vedio games?"))
    ff_miles = float(input("frequent flier miles earned per year?"))
    ice_cream = float(input("liters of ice cream consumed per year?"))
    dating_data, dating_labels = file2matrix("datingTestSet2.txt")
    normalize_matrix, ranges, min_val = auto_num(dating_data)
    # 將輸入指標,歸一化后代入分類器進行預測
    in_arr = np.array([ff_miles, percent_tats, ice_cream])
    # 聲明k為3的knn算法,n_neighbors即是鄰居數(shù)量,默認值為5
    knn = neighbors.KNeighborsClassifier(n_neighbors=3)
    # 訓練算法
    knn.fit(normalize_matrix, dating_labels)
    # 預測
    classifier_result = knn.predict([(in_arr - min_val) / ranges])
    print("You will probably like this person: ", result_list[classifier_result - 1][0])


# 執(zhí)行函數(shù)
knn_classify_person()

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

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/41659.html

相關文章

  • 如何用機器學習算法來進行電影分類?(含Python代碼)

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

    animabear 評論0 收藏0
  • 機器學習實戰(zhàn) Task1】 (KNN)k近鄰算法的應用

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

    toddmark 評論0 收藏0
  • 機器學習(六)-基于KNN分類算法的自動劃分電影的題材類型實現(xiàn)

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

    MkkHou 評論0 收藏0
  • 機器學習1——k近鄰算法

    k近鄰(k-Nearest Neighbor,kNN)算法是經(jīng)典的帶監(jiān)督的分類算法,核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數(shù)屬于某一個類別,則針對該樣本的劃分結果也屬于這個類別。 1. 算法步驟 準備訓練數(shù)據(jù)和測試數(shù)據(jù); 確定參數(shù) k; 計算測試數(shù)據(jù)與各個訓練數(shù)據(jù)之間的距離,距離的遞增關系進行排序; 選取距離最小的 k 個點; 確定前 k 個點所在類別的出現(xiàn)頻率; 返回前 ...

    seanlook 評論0 收藏0

發(fā)表評論

0條評論

SexySix

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<