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個最近鄰,將...