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数据集):
在这里插入图片描述
运行结果(鸢尾花数据集):
在这里插入图片描述
总结:刚开始时候什么都不知道,所以一时间不知道干啥,虽然knn算法比较简单,但是用python写的时候有很多的库的方法不知道,所以感觉有些棘手,不过写完了之后感觉还是很好的,毕竟有所收获而且还有一点点的成就感。

numpy速查手册
matplotlib绘图详解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值