天天看点

python实现knn算法

knn算法的概述:

        kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

本次算法实现使用的是鸢尾花数据集

算法设计:

1.准备数据,对数据进行预处理;

2.设定参数,如k;

3.遍历测试集,对测试集中每个样本,计算该样本(测试集中)到训练集中每个样本的距离,取出训练集中到该样本(测试集中)的距离最小的k个样本的类别标签,对类别标签进行计数,类别标签次数最多的就是该样本(测试集中)的类别标签。

4.遍历完毕.

–version1.0

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import numpy as np
import mglearn
import matplotlib.pyplot as plt
from collections import Counter
import pandas as pd

iris_dataset = load_iris()
#print(iris_dataset)

X_train,X_test,y_train,y_test = train_test_split(iris_dataset['data'],iris_dataset['target'],random_state = 10)
#print()



def dis(instant1,instant2):   #求欧式距离
    dist = np.sqrt(np.sum((instant1-instant2)**2))
    return dist


def knn_classfy(X,y,test,k):
    distances = [dis(x,test) for x in X]
    #print(distances)
    kneighbors = np.argsort(distances)[:k] #选取前K个邻居
    #print(kneighbors)
    count = Counter(y[kneighbors]) #记标签的个数
    #print(count)
    #print(count.most_common()[0][0])  
    return count.most_common()[0][0]  #统计出现次数最多的标签


pre = [knn_classfy(X_train,y_train,data,3) for data in X_test] #预测的标签集
print("预测:",pre)
print("测试: ",list(y_test))
co = np.count_nonzero((pre == y_test)) #统一测试集的标签和预测的标签相同的个数
print("The set score:{:.2f}".format(co / y_test.size))
           

–version 2.0

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import mglearn
import numpy as np
from collections import Counter


class Knn():
    def __init__(self,k=3):
        self.k = k

    def fit(self,x,y):
        self.x = x
        self.y = y

    def dis(self,instant1, instant2):  # 求欧式距离
        dist = np.sqrt(np.sum((instant1 - instant2) ** 2))
        return dist

    def knn_classfy(self,X,y,test):
        distances = [self.dis(x,test) for x in X]
        #print(distances)
        kneighbors = np.argsort(distances)[:self.k] #选取前K个邻居
        #print(kneighbors)
        count = Counter(y[kneighbors]) #记标签的个数
        #print(count)
        return count.most_common()[0][0]  #统计出现次数最多的标签
    
    def predict(self,test_x):	#求预测标签集
        pre = [self.knn_classfy(self.x,self.y,i) for i in test_x]  # 预测的标签集
        return  pre

    def score(self,test_x,test_y):
        pre = [self.knn_classfy(self.x,self.y,i) for i in test_x]  # 预测的标签集
        col = np.count_nonzero((pre == test_y))  # 统计测试集的标签和预测的标签相同的个数
        return col / test_y.size

# iris_dataset = load_iris()	鸢尾花数据集

# X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=15)


X, y = mglearn.datasets.make_forge()	#forge数据集
# print(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

#测试forge数据集
mknn = Knn(3)
mknn.fit(X_train, y_train)
print(mknn.predict(X_test))
print(mknn.score(X_test, y_test))
           

运行结果(forge数据集):

python实现knn算法

运行结果(鸢尾花数据集):

python实现knn算法

总结:刚开始时候什么都不知道,所以一时间不知道干啥,虽然knn算法比较简单,但是用python写的时候有很多的库的方法不知道,所以感觉有些棘手,不过写完了之后感觉还是很好的,毕竟有所收获而且还有一点点的成就感。

numpy速查手册

matplotlib绘图详解

继续阅读