摘要:而代碼是給出現(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)稱型
算法流程kNN算法收集數(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ù)的處理
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
group, label = create_data_set()
對(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]
classify0([0, 0], group, label, k=3)約會(huì)網(wǎng)站示例
# 將文本記錄轉(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
dating_data_mat, dating_labels = file2matrix("datingTestSet2.txt")
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()
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
normalize_data_set, ranges, min_val = auto_num(dating_data_mat) print(normalize_data_set)
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)))
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])
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
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
摘要:電影分析近鄰算法周末,小迪與女朋友小西走出電影院,回味著剛剛看過的電影。近鄰分類電影類型小迪回到家,打開電腦,想實(shí)現(xiàn)一個(gè)分類電影的案例。分類器并不會(huì)得到百分百正確的結(jié)果,我們可以使用很多種方法來(lái)驗(yàn)證分類器的準(zhǔn)確率。 電影分析——K近鄰算法 周末,小迪與女朋友小西走出電影院,回味著剛剛看過的電影。 小迪:剛剛的電影很精彩,打斗場(chǎng)景非常真實(shí),又是一部?jī)?yōu)秀的動(dò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è)非...
摘要:算法及工作原理近鄰算法采用測(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)景,我們不能單純依靠是...
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)頻率; 返回前 ...
閱讀 1541·2023-04-26 02:03
閱讀 4734·2021-11-22 13:53
閱讀 4642·2021-09-09 11:40
閱讀 3807·2021-09-09 09:34
閱讀 2140·2019-08-30 13:18
閱讀 3513·2019-08-30 11:25
閱讀 3308·2019-08-26 14:06
閱讀 2555·2019-08-26 13:52