KNN回歸python實現

2021-10-08 07:04:03 字數 4110 閱讀 2005

import numpy as np

import pandas as pd

data=pd.read_csv(r"f:\資料集\iris資料集\iris.csv"

)#刪除unnamed: 0與species對應的列(特徵),因為現在進行回歸**,類別資訊就沒有用處了

data.drop(

["unnamed: 0"

,"species"

],axis=

1,inplace=

true

)#刪除重複的記錄

data.drop_duplicates(inplace=

true

)

class

knn:

""" 使用python實現knn演算法。(回歸**)

該演算法用於回歸**,根據前三個特徵屬性,尋找最近的k個鄰居,

然後再根據k個鄰居的第四個特徵屬性,去**當前樣本的 第四個特徵值

"""def__init__

(self,k)

:"""

初始化方法

parameters:

____________

k:鄰居的個數

"""self.k=k

deffit(self,x,y)

:"""

訓練方法

parameters:

__________

x:類陣列型別(特徵矩陣),形狀為[樣本數量,特徵數量]

待訓練的樣本特徵(屬性)

y:類陣列型別(目標標籤),形狀為[樣本數量]

每個樣本的目標值(標籤)

"""#注意:將x y 轉化為ndarray陣列形式,方便統一進行操作

self.x=np.asarray(x)

self.y=np.asarray(y)

defpredict

(self,x)

:"""

根據引數傳遞的x,對樣本呢進行**

parameters:

___________

x:類陣列型別,形狀為[樣本數量,特徵數量]

待測試的樣本特徵(屬性)

return:陣列型別

**的結果值

"""#將x轉化為陣列型別

x=np.asarray(x)

#儲存**的結果值

result=

for x in x:

#計算距離。(計算與訓練集中每個x的距離)

dis=np.sqrt(np.

sum(

(x-self.x)**2

,axis=1)

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

index=dis.argsort(

)#進行切片,取前k個距離最近的索引(在原陣列中的索引)

index=index[

:self.k]

#計算均值,然後加入到結果列表當中))

return np.array(result)

defpredict2

(self,x)

:"""

根據引數傳遞的x,對樣本呢進行**(考慮權重)

權重的計算方式:

使用每個節點(鄰居)距離的倒數/所有節點距離倒數之和

parameters:

___________

x:類陣列型別,形狀為[樣本數量,特徵數量]

待測試的樣本特徵(屬性)

return:陣列型別

**的結果值

"""#將x轉化為陣列型別

x=np.asarray(x)

#儲存**的結果值

result=

for x in x:

#計算距離。(計算與訓練集中每個x的距離)

dis=np.sqrt(np.

sum(

(x-self.x)**2

,axis=1)

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

index=dis.argsort(

)#進行切片,取前k個距離最近的索引(在原陣列中的索引)

index=index[

:self.k]

s=np.

sum(1/

(dis[index]

+0.001))

#使用每個節點距離的倒數,除以倒數之和,得到權重

weight=(1

/(dis[index]

+0.001))

/s #使用鄰居節點的標籤值,誠意對應的權重,然後相加,得到最終的**結果

sum(self.y[index]

*weight)

)return np.array(result)

t=data.sample(

len(data)

,random_state=0)

train_x=t.iloc[

:120,:

-1]train_y=t.iloc[

:120,-

1]test_x=t.iloc[

120:,:

-1]test_y=t.iloc[

120:,-

1]knn=knn(k=3)

knn.fit(train_x,train_y)

result=knn.predict(test_x)

display(result)

np.mean(np.

sum(result-test_y)**2

)display(test_y.values)

array([0.2       , 2.06666667, 0.2       , 1.93333333, 1.26666667,

1.2 , 1.23333333, 2. , 1.13333333, 1.93333333,

2.03333333, 1.83333333, 1.83333333, 0.2 , 1.16666667,

2.26666667, 1.63333333, 0.3 , 1.46666667, 1.26666667,

1.66666667, 1.33333333, 0.26666667, 0.23333333, 0.2 ,

2.03333333, 1.26666667, 2.2 , 0.23333333])

array([0.2, 1.6, 0.2, 2.3, 1.3, 1.2, 1.3, 1.8, 1. , 2.3, 2.3, 1.5, 1.7,

0.2, 1. , 2.1, 2.3, 0.2, 1.3, 1.3, 1.8, 1.3, 0.2, 0.4, 0.1, 1.8,

1. , 2.2, 0.2])

import matplotlib as mpl

import matplotlib.pyplot as plt

mpl.rcparams[

"font.family"]=

"simhei"

mpl.rcparams[

"axes.unicode_minus"]=

false

plt.figure(figsize=(8

,8))

#繪製**值

plt.plot(result,

"ro-"

,label=

"**值"

)#繪製真實值

plt.plot(test_y.values,

"go--"

,label=

"真實值"

)plt.title(

"knn 連續值**展示"

)plt.xlabel(

"節點序號"

)plt.ylabel(

"花瓣寬度"

Python實現KNN回歸

knn演算法不僅可以用於分類,還可以用於回歸。通過找出乙個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。以下是knn回歸 calendar strategy knn.py 中用到的部分 x np.array x y np.array y x x.reshape 1,...

筆記 KNN演算法實現分類和回歸

class knn def init self,k 初始化 self.k k deffit self,x,y 訓練方法 x 類陣列型別 二維 待訓練的樣本特徵 屬性 y 一維 樣本的目標值 標籤 self.x np.asarray x 轉化為ndarray陣列型別 self.y np.asarray...

kNN做回歸任務

knn常用作分類任務,但是也可以做回歸任務。做法 使用knn計算某個資料點的 值時,模型會從訓練資料集中選擇離該資料點最近的k個資料點,並且把他們的y值取均值,把該均值作為新資料點的 值。此次 演示使用資料庫中的鳶尾花資料集,通過前三個的特徵值,第四個特徵值。根據前三個特徵找出新資料的k個最近鄰,將...