對資料進行處理
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個點所在類別的出現頻率,...