摘要:而代碼是給出現情況增加次數,出現一次排序導入運算符模塊的方法,按照第二個元素的次序對元組進行排序,此處的排序為逆序。
機器學習——K近鄰算法 概述
k近鄰是一種基本分類與回歸方法.
輸入:特征向量
輸出:實例的類別(可取多類)
核心思想:如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數屬于某一個類別,則該樣本也屬于這個類別,并具有這個類別上樣本的特性.
優點:計算精度高、對異常值不敏感、無數據輸入假定
缺點:計算復雜度高、空間復雜度高
適用范圍:數值型和標稱型
算法流程kNN算法收集數據
準備數據:距離計算所需要的數值,最好是結構化的數據格式
分析數據:可以適用任何方法
訓練算法:此步驟不適用于KNN
測試算法:計算錯誤率
使用算法:首先需要輸入樣本數據和結構化的輸出結果,然后運行k-近鄰算法判定輸入數據分別屬于哪個分類,最后應用對計算出的分類執行后續的處理
import numpy as np def create_data_set(): """構造數據集""" 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()
對未知類別屬性的數據集種的每個點依次執行以下步驟:
1. 計算已知類別屬性的數據集中的每個點與當前點之間的距離
2. 按照距離遞增次序排序
3. 選取與當前點距離最小的k個點
4. 確定前k個點所在類別的出現頻率
5. 返回前k個點出現頻率最高的類別作為當前點的預測分類
?
import operator def classify0(inX, data_set, label, k): """ KNN算法 :param inX: 用于分類的輸入向量 :param data_set: 訓練樣本集 :param label: 訓練標簽向量 :param k: 選取最近鄰居的數量 :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函數返回的是數組值從小到大的索引值 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。而代碼是給出現情況增加次數,出現一次+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)約會網站示例
# 將文本記錄轉換為numpy的解析程序 def file2matrix(filename): fr = open(filename) # readlines把文件所有內容讀取出來,組成一個列表,其中一行為一個元素 array_of_lines = fr.readlines() number_of_lines = len(array_of_lines) # 返回一個用1000行每行3個0填充的數組,形成特征矩陣 return_mat = np.zeros((number_of_lines, 3)) class_label_vector = [] for index, line in enumerate(array_of_lines): # 去除每行前后的空格 line = line.strip() # 根據 把每行分隔成由四個元素組成的列表 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
dating_data_mat, dating_labels = file2matrix("datingTestSet2.txt")
import matplotlib.pyplot as plt # 創建Figure實例 fig = plt.figure() # 添加一個子圖,返回Axes實例 ax = fig.add_subplot(111) # 選取最近鄰居的數量 # 生成散點圖,x軸使用dating_data_mat第二列數據,y軸使用dating_data_mat的第三列數據 # 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()
def auto_num(data_set): """ 歸一化特征值 :param data_set: 數據集 :return 歸一化后的數據集, 列的差值范圍, 列的最小值 """ # 列的最小值 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(): # 選擇測試數據量 ho_ratio = 0.10 # 解析數據 dating_data_mat, dating_labels = file2matrix("datingTestSet2.txt") # 歸一化數據 norm_mat, range_s, min_val = auto_num(dating_data_mat) # 拆分10%數據作為測試數據 m = norm_mat.shape[0] # 總數據量 num_test_vec = int(m * ho_ratio) # 測試數據量 # 錯誤樣本計數 error_count = 0.0 # 對測試數據進行分類,并對比檢驗結果正確率 for i in range(num_test_vec): classifier_result = classify0( # classifier_result : k個鄰居里頻率最高的分類 norm_mat[i, :], # 用于分類的輸入向量(測試數據, : 表示一行內所有元素) norm_mat[num_test_vec: m, :], # 訓練樣本集(從測試的數據開始到總數據量結束) dating_labels[num_test_vec:m], # 訓練標簽向量(從測試的數據開始到總數據量結束) 3 # 選取最近鄰居的數量 ) 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(): """ 根據輸入指標,通過分類器進行預測喜歡程度 :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])
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(): """ 根據輸入指標,通過分類器進行預測喜歡程度 :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即是鄰居數量,默認值為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]) # 執行函數 knn_classify_person()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41659.html
摘要:電影分析近鄰算法周末,小迪與女朋友小西走出電影院,回味著剛剛看過的電影。近鄰分類電影類型小迪回到家,打開電腦,想實現一個分類電影的案例。分類器并不會得到百分百正確的結果,我們可以使用很多種方法來驗證分類器的準確率。 電影分析——K近鄰算法 周末,小迪與女朋友小西走出電影院,回味著剛剛看過的電影。 小迪:剛剛的電影很精彩,打斗場景非常真實,又是一部優秀的動作片! 小西:是嗎?我怎么感覺這...
摘要:背景近鄰算法的概述近鄰算法的簡介近鄰算法是屬于一個非常有效且易于掌握的機器學習算法,簡單的說就是采用測量不同特征值之間距離的方法對數據進行分類的一個算法。完美的分類器的錯誤率為,而最差的分類器的錯誤率則為。 1 背景 1.1 k近鄰算法的概述 (1)k近鄰算法的簡介 k-近鄰算法是屬于一個非...
摘要:算法及工作原理近鄰算法采用測量不同特征值之間的距離方法進行分類。最后選擇個最相似數據中出現次數最多的分類作為新數據的分類。 1 分類算法引言 眾所周知,電影可以按照題材分類,然而題材本身是如何定義的?由誰來判定某部電影屬于哪個題材?也就是說同一題材的電影具有哪些公共特征?這些都是在進行電影分類時必須要考慮的問題。 動作片中也會存在接吻鏡頭,愛情片中也會存在打斗場景,我們不能單純依靠是...
k近鄰(k-Nearest Neighbor,kNN)算法是經典的帶監督的分類算法,核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數屬于某一個類別,則針對該樣本的劃分結果也屬于這個類別。 1. 算法步驟 準備訓練數據和測試數據; 確定參數 k; 計算測試數據與各個訓練數據之間的距離,距離的遞增關系進行排序; 選取距離最小的 k 個點; 確定前 k 個點所在類別的出現頻率; 返回前 ...
閱讀 1530·2023-04-26 02:03
閱讀 4717·2021-11-22 13:53
閱讀 4594·2021-09-09 11:40
閱讀 3789·2021-09-09 09:34
閱讀 2129·2019-08-30 13:18
閱讀 3505·2019-08-30 11:25
閱讀 3302·2019-08-26 14:06
閱讀 2548·2019-08-26 13:52