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

2021-10-08 17:02:37 字數 4047 閱讀 2068

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(y)

defpredict

(self,x)

: x=np.asarray(x)

result=

for x in x:

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

dis=np.sqrt(np.

sum(

(x-self.x)**2

,axis=1)

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

index=dis.argsort(

)#只取前k個

index=index[

:self.k]

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

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

)#返回出現次數最多的元素的索引,該索引就是我們判斷的類別.加入resul陣列))

return np.asarray(result)

defpredict2

(self,x)

:#考慮權重,權重為距離的倒數。

x=np.asarray(x)

result=

for x in x:

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

dis=np.sqrt(np.

sum(

(x-self.x)**2

,axis=1)

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

index=dis.argsort(

)#只取前k個

index=index[

:self.k]

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

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

,weights=

1/dis[index]

)#返回出現次數最多的元素的索引,該索引就是我們判斷的類別.加入resul陣列))

return np.asarray(result)

class

knn:

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

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

def__init__

(self,k)

: self.k=k

deffit(self,x,y)

: self.x=np.asarray(x)

self.y=np.asarray(y)

defpredict

(self,x)

: x=np.asarray(x)

result=

for x in x:

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

dis=np.sqrt(np.

sum(

(x-self.x)**2

,axis=1)

)#取前k個

index=dis.argsort(

) index=index[

:self.k]

#計算前k個的值,取均值返回到結果列表中))

return np.array(result)

defpredict2

(self,x)

:#考慮權重:權重=(1/每個鄰居的距離)/所有的距離倒數之和

x=np.asarray(x)

result=

for x in x:

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

dis=np.sqrt(np.

sum(

(x-self.x)**2

,axis=1)

)#取前k個

index=dis.argsort(

) index=index[

:self.k]

#計算所有鄰居節點的距離倒數之和。注意:加上0.0001是為了防止距離為0使得分母為0

s=np.

sum(1/

(dis[index]

+0.0001))

#求權重:每個距離的倒數/倒數之和

weight=(1

/(dis[index]

+0.0001))

/s #使用鄰居節點的標籤值*權重,然後進行累加求和,得到**值

sum(self.y[index]

*weight)

)return np.array(result)

import numpy as np

from sklearn.neighbors import kneighborsclassifier

from collections import counter

from math import sqrt

class

knnclassfier

:def

__init__

(self,k)

:""""初始化knn分類器"""

assert k>=1,

"k must be valid"

self.k=k

self._x_train=

none

self._y_train=

none

deffit

(self,x_train,y_train)

:assert x_train.shape[0]

==y_train.shape[0]

,"the size must equal"

assert self.k<=x_train.shape[0]

self._x_train=x_train

self._y_train=y_train

return self

defpredict

(self,x_predict)

:assert self._x_train is

notnone

and self._y_train is

notnone

,"must fit before predict!"

assert x_predict.shape[1]

==self._x_train.shape[1]

,"the size must equal"

y_predict=

[self._predict(x)

for x in x_predict]

return np.array(y_predict)

def_predict

(self,x)

:assert x.shape[0]

==self._x_train.shape[1]

,"must equal!"

distances =

[sqrt(np.

sum(

(x_train - x)**2

))for x_train in self._x_train]

nearest = np.argsort(distances)

topk_y =

[self._y_train[i]

for i in nearest[

:self.k]

] votes = counter(topk_y)

predict_y = votes.most_common(1)

[0][

0]return predict_y

KNN分類和回歸學習 sklearn

參考文章 python大戰機器學習 不好,就是官方文件的中文版再加上幾個簡單的例子 資料探勘十大演算法 k近鄰演算法 機器學習筆記 knn演算法 常用樣本相似性和距離度量方法 輸入為例項的特徵向量,計算新資料與訓練資料之間的距離,選取k個距離最近的資料進行分類或回歸判斷 對於分類問題 輸出為例項的類...

kNN分類器和Python演算法實現

假設生活中你突然遇到乙個陌生人,你對他很不了解,但是你知道他喜歡看什麼樣的電影,喜歡穿什麼樣的衣服。根據以前你的認知,你把你身邊的朋友根據喜歡的電影型別,和穿什麼樣的衣服,簡單的分為了兩類,有錢的和沒錢的。那你該怎麼將這個陌生人分類呢?物以類聚,人以群分,你看他喜歡看的電影和穿衣服的衣服和那群人比較...

Python 實現 KNN 分類演算法

2.python 實現 本文將詳細講述 knn 演算法及其 python 實現 knn k nearest neighbour 即 k最近鄰,是分類演算法中最簡單的演算法之一。knn 演算法的核心思想是如果乙個樣本在特徵空間中的 k 個最相鄰的樣本中的大多數屬於某乙個類別,則將該樣本歸為該類別 有 ...