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

資訊專欄INFORMATION COLUMN

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

SexySix / 1657人閱讀

摘要:而代碼是給出現(xiàn)情況增加次數(shù),出現(xiàn)一次排序?qū)脒\(yùn)算符模塊的方法,按照第二個(gè)元素的次序?qū)υM進(jìn)行排序,此處的排序?yàn)槟嫘颉?/p>

機(jī)器學(xué)習(xí)——K近鄰算法 概述

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

輸入:特征向量

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

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

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

缺點(diǎn):計(jì)算復(fù)雜度高、空間復(fù)雜度高

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

算法流程

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

準(zhǔn)備數(shù)據(jù):距離計(jì)算所需要的數(shù)值,最好是結(jié)構(gòu)化的數(shù)據(jù)格式

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

訓(xùn)練算法:此步驟不適用于KNN

測(cè)試算法:計(jì)算錯(cuò)誤率

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

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

def create_data_set():
    """構(gòu)造數(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()
實(shí)現(xiàn)kNN算法偽代碼

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

1. 計(jì)算已知類別屬性的數(shù)據(jù)集中的每個(gè)點(diǎn)與當(dāng)前點(diǎn)之間的距離

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

3. 選取與當(dāng)前點(diǎn)距離最小的k個(gè)點(diǎn)

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

5. 返回前k個(gè)點(diǎn)出現(xiàn)頻率最高的類別作為當(dāng)前點(diǎn)的預(yù)測(cè)分類
?

import operator

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

    """距離計(jì)算"""
    # 獲得樣本量
    data_set_size = data_set.shape[0]
    # tile:在行方向重復(fù)inX,dataSetSize次,在列方向上重復(fù)inX,1次
    diff_mat = np.tile(inX, (data_set_size, 1)) - data_set
    # 離原點(diǎn)的距離,相見后平方
    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 = {}
    """選擇距離最小的點(diǎn)"""
    for i in range(k):
        # 返回距離最近的第i個(gè)樣本所對(duì)應(yīng)的標(biāo)簽
        vote_label = label[sorted_distance_index[i]]
        # print(voteIlabel)
        # print(classCount.get(voteIlabel, 0))
        # 這里的0是設(shè)置默認(rèn)值為0,而代替None。而代碼是給出現(xiàn)情況增加次數(shù),出現(xiàn)一次+1
        class_count[vote_label] = class_count.get(vote_label, 0) + 1
        # print(classCount)
    """排序"""
    # 導(dǎo)入運(yùn)算符模塊的itemgetter方法,按照第二個(gè)元素的次序?qū)υM進(jìn)行排序,此處的排序?yàn)槟嫘颉?    sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
    # 返回頻率最大的Label
    return sorted_class_count[0][0]
添加算法測(cè)試代碼
classify0([0, 0], group, label, k=3)
約會(huì)網(wǎng)站示例
加載并解析數(shù)據(jù)
# 將文本記錄轉(zhuǎn)換為numpy的解析程序
def file2matrix(filename):
    fr = open(filename)
    # readlines把文件所有內(nèi)容讀取出來(lái),組成一個(gè)列表,其中一行為一個(gè)元素
    array_of_lines = fr.readlines()
    number_of_lines = len(array_of_lines)
    # 返回一個(gè)用1000行每行3個(gè)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ù)	把每行分隔成由四個(gè)元素組成的列表
        list_from_line = line.split("	")
        # 選取前3個(gè)元素,將它們按順序存儲(chǔ)到特征矩陣中
        return_mat[index, :] = list_from_line[0: 3]
        # 將列表的最后一個(gè)元素儲(chǔ)存到class_label_vector中去,儲(chǔ)存的元素值為整型
        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)建散點(diǎn)圖
import matplotlib.pyplot as plt

# 創(chuàng)建Figure實(shí)例
fig = plt.figure()
# 添加一個(gè)子圖,返回Axes實(shí)例
ax = fig.add_subplot(111)  # 選取最近鄰居的數(shù)量
# 生成散點(diǎn)圖,x軸使用dating_data_mat第二列數(shù)據(jù),y軸使用dating_data_mat的第三列數(shù)據(jù)
# ax.scatter(x=dating_data_mat[:, 1], y=dating_data_mat[:, 2])
# 個(gè)性化標(biāo)記散點(diǎn)圖,形狀(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
    # 構(gòu)造返回矩陣
    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
歸一化測(cè)試
normalize_data_set, ranges, min_val = auto_num(dating_data_mat)
print(normalize_data_set)
測(cè)試算法
def dating_class_test():
    # 選擇測(cè)試數(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ù)作為測(cè)試數(shù)據(jù)
    m = norm_mat.shape[0]  # 總數(shù)據(jù)量
    num_test_vec = int(m * ho_ratio)  # 測(cè)試數(shù)據(jù)量
    # 錯(cuò)誤樣本計(jì)數(shù)
    error_count = 0.0
    # 對(duì)測(cè)試數(shù)據(jù)進(jìn)行分類,并對(duì)比檢驗(yàn)結(jié)果正確率
    for i in range(num_test_vec):
        classifier_result = classify0(  # classifier_result : k個(gè)鄰居里頻率最高的分類
            norm_mat[i, :],  # 用于分類的輸入向量(測(cè)試數(shù)據(jù), : 表示一行內(nèi)所有元素)
            norm_mat[num_test_vec: m, :],  # 訓(xùn)練樣本集(從測(cè)試的數(shù)據(jù)開始到總數(shù)據(jù)量結(jié)束)
            dating_labels[num_test_vec:m],  # 訓(xùn)練標(biāo)簽向量(從測(cè)試的數(shù)據(jù)開始到總數(shù)據(jù)量結(jié)束)
            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í)行測(cè)試
dating_class_test()
使用算法
def classify_person():
    """
    根據(jù)輸入指標(biāo),通過分類器進(jìn)行預(yù)測(cè)喜歡程度
    :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)
    # 將輸入指標(biāo),歸一化后代入分類器進(jìn)行預(yù)測(cè)
    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中實(shí)現(xiàn)
from sklearn import neighbors

def knn_classify_person():
    """
        根據(jù)輸入指標(biāo),通過分類器進(jìn)行預(yù)測(cè)喜歡程度
    :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)
    # 將輸入指標(biāo),歸一化后代入分類器進(jìn)行預(yù)測(cè)
    in_arr = np.array([ff_miles, percent_tats, ice_cream])
    # 聲明k為3的knn算法,n_neighbors即是鄰居數(shù)量,默認(rèn)值為5
    knn = neighbors.KNeighborsClassifier(n_neighbors=3)
    # 訓(xùn)練算法
    knn.fit(normalize_matrix, dating_labels)
    # 預(yù)測(cè)
    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()

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

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

相關(guān)文章

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

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

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

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

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

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

    MkkHou 評(píng)論0 收藏0
  • 機(jī)器學(xué)習(xí)1——k近鄰算法

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

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

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

0條評(píng)論

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