機器學習系列(一) KNN分類

2021-10-10 22:19:44 字數 4064 閱讀 6732

對資料進行處理

import numpy as np

import pandas as pd

# 讀取資料集 header引數用來指定標題的行,預設為零,如果預設沒有標題,則使用none

data = pd.read_csv('iris.csv')

print(data)

# 顯示前n行資料,預設值為5

# print(data.head())

# 顯示末尾的n行記錄,預設值為5

# print(data.tail())

# 隨機抽取樣本,預設抽取一條,可以通過引數進行指定抽取樣本的數量

# print(data.sample(10))

# 資料對映

data['species'] = data['species'].map()

# print(data)

# 檢視各個類別的鶯尾花有多少條記錄

print(data['species'].value_counts())

# 長度

n = len(data)

# print(n)

# 刪除不需要的id列

# data.drop('')

# data = data.drop('id',axis=0,inplace=true)

# 是否重複

# data = data.duplicated().any()

# 刪除重複

# data = data.drop_duplicates(inplace=true)

# print(len(data))

knn類

class knn:

# 實現k鄰演算法

def __init__(self,k):

# 初始化方法

# paramaters

# k : int 鄰居的個數

self.k = k

def fit(self,x,y):

# 訓練方法

# paramaters x : 類陣列型別, 形狀為: 待訓練的樣本特徵(屬性)

# y : 類陣列型別, 形狀為: 每個樣本的目標值(標籤)

# 將x樣本轉換為ndarray陣列型別

self.x = np.asarray(x)

self.y = np.asarray(y)

def predict(self,x):

# 根據引數傳遞的樣本, 對樣本資料進行**

# paramaters x : 類陣列型別, 形狀為: 待訓練的樣本特徵(屬性)

# return result:陣列型別

# **的結果

x = np.asarray(x)

result =

# 每次取陣列中的一樣資料

for x in x:

# 對於測試集中的每乙個樣本 依次與訓練集中的所有樣本求距離

dis = np.sqrt(np.sum((x - self.x)**2,axis=1))

# 返回陣列排序後 每個元素在原陣列中的索引

index = dis.argsort()

# 進行截斷 只取前k個元素 取距離最近的k個元素的索引

index = index[:self.k]

# print(index)

# 返回陣列中每個元素出現的次數 元素必須是非負的整數

# count = np.bincount(self.y[index])

count = np.bincount(self.y[index])

# 返回ndarray陣列中,值最大的元素對應的索引 該索引就是我們判定的類別

# 最大元素索引, 就是出現次數最多的元素

return np.asarray(result)

對資料進行訓練和測試

# 提取每個類別中鶯尾花的資料

t0 = data[data['species'] == 0]

# print(len(t0))

t1 = data[data['species'] == 1]

t2 = data[data['species'] == 2]

# 為了資料具有隨機性 進行洗牌

t0 = t0.sample(len(t0),random_state=0)

t1 = t1.sample(len(t1),random_state=0)

t2 = t2.sample(len(t2),random_state=0)

#構建訓練集和測試集

train_x = pd.concat([t0.iloc[:40,:-1],t1.iloc[:40,:-1],t2.iloc[:40,:-1]],axis=0)

train_y = pd.concat([t0.iloc[:40,:-1],t1.iloc[:40,:-1],t2.iloc[:40,:-1]],axis=0)

test_x = pd.concat([t0.iloc[40:,:-1],t1.iloc[40:,:-1],t2.iloc[40:,:-1]],axis=0)

test_y = pd.concat([t0.iloc[40:,:-1],t1.iloc[40:,:-1],t2.iloc[40:,:-1]],axis=0)

# 建立knn物件 進行訓練和測試

knn = knn(k=3)

# 進行訓練

knn.fit(train_x,train_y)

# 進行測試 獲得測試結果

result = knn.predict(test_x)

print(result)

print(np.sum(result==test_y))

print(np.sum(result==test_y)/len(result))

knn視覺化

import matplotlib as mpl

import matplotlib.pyplot as plt

# 預設情況下 matplotlib不支援中文顯示,我們需要進行一下設定

# 設定字型為黑體 以支援中文顯示

mpl.rcparams['font.family'] = 'simhei'

# 設定在中文字型時 能夠正常的顯示負號(-)

mpl.rcparams['axes.unicode_minus'] = false

# # 設定畫布的大小

plt.figure(10,10)

# 繪製訓練散點圖

plt.scatter(x=t0['sepal.length '][:40],y=t0['petal.length'],color='r',label='virginica')

plt.scatter(x=t1['sepal.length '][:40],y=t1['petal.length'],color='g',label='setosa')

plt.scatter(x=t2['sepal.length '][:40],y=t2['petal.length'],color='b',label='versicolor')

# 繪製測試集資料

right = test_x[result == test_y]

wrong = test_x[result != test_y]

plt.scatter(x=right['sepal.length '],y=right['petal.length'],color='c',marker='s',lable='right' )

plt.scatter(x=wrong['sepal.length '],y=wrong['petal.length'],color='a',marker='>',lable='wrong' )

plt.xlabel('花萼長度')

plt.ylabel('花瓣長度')

plt.title('knn分類結果顯示')

plt.legend(loc='best')

plt.show()

機器學習 K NN分類

一 定義 1 k nn分類全稱為k近鄰法 k nearest neighbor 是一種基本回歸與分類方法 給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最近的k個例項,這k個例項中多數例項屬於某一類,就把該輸入例項分為這一類。2 好比說,你周圍的同學大都是些好學生,你也會被認為是好學...

機器學習分類演算法(一)k NN分類演算法

k kk nn分類器是最簡單的機器學習分類演算法之一,它的基本思想是 從訓練樣本集中找出與測試樣本 距離 最近的k個樣本作為此測試樣本的 鄰居 然後根據這k個樣本的類別基於一定規則進行投票表決,最高的決定為測試樣本的 類別。用乙個詞來說就是 近朱者赤近墨者黑 由以上所述可以得知,k近鄰分類演算法主要...

機器學習 K NN分類 回歸

k近鄰 從字面上理解,就是 近朱者赤,近墨者黑。和誰離得近和誰歸為一類。1 演算法原理 1 計算測試資料與各個訓練資料之間的距離,方法 閔可夫斯基距離 2 按照距離的遞增順序排序 3 選取距離最小的k個點 4 確定前k個點所在類別的出現頻率 即為各個類別出現次數 5 返回前k個點所在類別的出現頻率,...