knn筆記
演算法大致步驟(**y的類別為例):
1)計算樣本y與訓練樣本(已知標籤樣本)的距離;
2)找出距離最近的k個樣本;
3)選擇這k個樣本中出現最多的類別作為y的類別標記;
資料集 iris為鳶尾花樣本,前四列為特徵,最後一列為標籤,如下圖
資料連線:
有點笨,直接手動將資料分為訓練集和測試集
**如下:
# -*- coding: utf-8 -*-
import operator
import pandas as pd
import numpy as np
# 獲取訓練資料和測試資料
def get_data(train_path, test_path):
train_data = pd.read_table(train_path, sep=',', header=none)
test_data = pd.read_table(test_path, sep=',', header=none)
train_data = np.array(train_data)
test_data = np.array(test_data)
return train_data, test_data
# 計算歐幾里得距離
def get_distance(x, y):
x[:4] = [float(i) for i in x[:4]]
y[:4] = [float(i) for i in y[:4]]
distance = np.sqrt(np.sum(np.square(x[:4] - y[:4])))
return distance
def get_neighbors(train_data, y, k):
distance_xy = #存放訓練樣本與y的距離
for x in train_data:
distance_xy.sort(key=operator.itemgetter(1)) #對距離排序
neighbors_k = #存放距離前k個較小值
for i in range(k):
return neighbors_k
# 根據k個近樣本投票
def vote_for_y(neighbors_k):
label_numbel = {} #存放標籤及其投票標籤
for x in neighbors_k:
# l = x[-1] in label_numbel.keys()
if x[-1] in label_numbel.keys():
label_numbel[x[-1]] += 1
else:
label_numbel[x[-1]] = 1
# 對投票結果排序,返回得票最高的標籤
label_numbel = sorted(label_numbel.items(), key=operator.itemgetter(1), reverse=true)
predict_label = label_numbel[0][0]
return predict_label
def predict(train_data, test_data, k):
predict = #存放**標籤
for y in test_data:
neighbors_k = get_neighbors(train_data, y, k)#獲取測試樣本y的k個最近樣本
predict_y = vote_for_y(neighbors_k)#投票獲取y的標籤
return np.array(predict)
def get_accuracy(test_data, pre_label):
# 獲取原始標籤
labels =
for y in test_data:
labels = np.array(labels)
# 求準確率
accuracy = np.mean(np.asarray(pre_label == labels, dtype=int))
return accuracy
if __name__ == "__main__":
train_path = r'iris_train.txt'
test_path = r'iris_test.txt'
train_data, test_data = get_data(train_path, test_path) # 獲取資料
# 為了尋找最優的k,設定k_min <= k <=k_max
k_max = 13 # 設定k的上限
k_min = 3 # k的下限
accuracy_dict = {} # 存放k與準確率
for k in range(k_min, k_max + 1):
pre_label = predict(train_data, test_data, k)#獲取**結果
accuracy = get_accuracy(test_data, pre_label)#判斷準確率
accuracy_dict[k] = accuracy
# 排序,找到準確率最高時的k
accuracy_dict = sorted(accuracy_dict.items(), key=operator.itemgetter(1), reverse=true)
print('當 k = ', accuracy_dict[0][0], ' --- 準確率為:', accuracy_dict[0][1])
留在最後的話:順德的松記火鍋真的是好吃 使用K近鄰對iris資料集進行分類
聽了好幾年的k近鄰演算法 今天終於接觸到了 原理很簡單 講樣本對映為多維空間中的點 無標籤新樣本 由空間中與其最近的k個點中數量最多的標籤來定義 以下為暴力實現 高效演算法留坑 from sklearn import datasets def cmp elem return elem 0 iris ...
機器學習iris資料集匯入
iris資料集在模式識別研究領域應該是最知名的資料集了,有很多文章都用到這個資料集。這個資料集裡一共包括150行記錄,其中前四列為花萼長度,花萼寬度,花瓣長度,花瓣寬度等4個用於識別鳶尾花的屬性,第5列為鳶尾花的類別 包括setosa,versicolour,virginica三類 也即通過判定花萼...
用TensorFlow實現iris資料集線性回歸
本文將遍歷批量資料點並讓tensorflow更新斜率和y截距。這次將使用scikit learn的內建iris資料集。特別地,我們將用資料點 x值代表花瓣寬度,y值代表花瓣長度 找到最優直線。選擇這兩種特徵是因為它們具有線性關係,在後續結果中將會看到。本文將使用l2正則損失函式。用tensorflo...