ML KNN(K近鄰,iris資料集為例)

2021-09-01 23:51:57 字數 2903 閱讀 3089

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...