KNN分类

作者: SLClinchen | 来源:发表于2018-11-01 21:02 被阅读0次

邻近算法(kNN,k-NearestNeighbor),是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。

KNN分类算法,类设计:

class KNN:
    """使用Python语言实现K近邻算法。(实现分类)"""
    
    def __init__(self, k):
        """初始化方法
        
        Parameters
        -----
        k : int
            邻居的个数。
        
        """
        self.k = k
        
    def fit(self, X, y):
        """训练方法
        
        Parameters
        -----
        X : 类数组类型,形状为:[样本数量, 特征数量]
            待训练的样本特征(属性)
        
        y : 类数组类型,形状为: [样本数量]
            每个样本的目标值(标签)。
        """
        
        # 将X转换成ndarray数组类型。
        self.X = np.asarray(X)
        self.y = np.asarray(y)
        
    def predict(self, X):
        """根据参数传递的样本,对样本数据进行预测。
        
        Parameters
        -----
        X : 类数组类型,形状为:[样本数量, 特征数量]
            待训练的样本特征(属性) 
        
        Returns
        -----
        result : 数组类型
            预测的结果。
        
        """
        
        X = np.asarray(X)
        result = []
        # 对ndarray数组进行遍历,每次取数组中的一行。
        for x in X:
            # 对于测试集中的每一个样本,依次与训练集中的所有样本求距离。
            dis = np.sqrt(np.sum((x - self.X) ** 2, axis=1))
            # 返回数组排序后,每个元素在原数组(排序之前的数组)中的索引。
            index = dis.argsort()
            # 进行截断,只取前k个元素。【取距离最近的k个元素的索引】
            index = index[:self.k]
            # 返回数组中每个元素出现的次数。元素必须是非负的整数。
            count = np.bincount(self.y[index])
            # 返回ndarray数组中,值最大的元素对应的索引。该索引就是我们判定的类别。
            # 最大元素索引,就是出现次数最多的元素。
            result.append(count.argmax())
        return np.asarray(result)
    
    def predict2(self, X):
        """根据参数传递的样本,对样本数据进行预测(考虑权重的,使用距离的倒数作为权重)。
        
        Parameters
        -----
        X : 类数组类型,形状为:[样本数量, 特征数量]
            待训练的样本特征(属性) 
        
        Returns
        -----
        result : 数组类型
            预测的结果。
        
        """
        
        X = np.asarray(X)
        result = []
        # 对ndarray数组进行遍历,每次取数组中的一行。
        for x in X:
            # 对于测试集中的每一个样本,依次与训练集中的所有样本求距离。
            dis = np.sqrt(np.sum((x - self.X) ** 2, axis=1))
            # 返回数组排序后,每个元素在原数组(排序之前的数组)中的索引。
            index = dis.argsort()
            # 进行截断,只取前k个元素。【取距离最近的k个元素的索引】
            index = index[:self.k]
            # 返回数组中每个元素出现的次数。元素必须是非负的整数。【使用weights考虑权重,权重为距离的倒数。】
            count = np.bincount(self.y[index], weights=1 / dis[index])
            # 返回ndarray数组中,值最大的元素对应的索引。该索引就是我们判定的类别。
            # 最大元素索引,就是出现次数最多的元素。
            result.append(count.argmax())
        return np.asarray(result)

类的使用:

# 提取出每个类比的鸢尾花数据
t0 = data[data["Species"] == 0]
t1 = data[data["Species"] == 1]
t2 = data[data["Species"] == 2]
# 对每个类别数据进行洗牌。
t0 = t0.sample(len(t0), random_state=0)
t1 = t1.sample(len(t1), random_state=0)
t2 = t2.sample(len(t2), random_state=0)
# 构建训练集与测试集。
train_X = pd.concat([t0.iloc[:40, :-1], t1.iloc[:40, :-1], t2.iloc[:40, :-1]], axis=0)
train_y = pd.concat([t0.iloc[:40, -1], t1.iloc[:40, -1], t2.iloc[:40, -1]], axis=0)
test_X = pd.concat([t0.iloc[40:, :-1], t1.iloc[40:, :-1], t2.iloc[40:, :-1]], axis=0)
test_y = pd.concat([t0.iloc[40:, -1], t1.iloc[40:, -1], t2.iloc[40:, -1]], axis=0)
# 创建KNN对象,进行训练与测试。
knn = KNN(k=10)
# 进行训练
knn.fit(train_X, train_y)
# 进行测试,获得测试的结果。
result = knn.predict(test_X)
# display(result)
# display(test_y)
display(np.sum(result == test_y))
display(np.sum(result == test_y)/ len(result))

# 考虑权重,进行一下测试。
result2 = knn.predict2(test_X)
display(np.sum(result2 == test_y))

相关文章

  • 机器学习笔记汇总

    kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法

  • 100天机器学习实践之第7天

    K—近邻分类算法(KNN) KNN是什么? K—近邻算法(简称KNN)是一种虽然简单但很常用的分类算法,也可用于回...

  • 利用Python进行数字识别

    思路 通过Python实现KNN算法。而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类...

  • kNN分类算法实例

    写在前面: kNN算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法,它是分类技术中最简单...

  • 大数据算法:分类算法

    KNN分类算法 KNN算法,即K近邻(K Nearest Neighbour)算法,是一种基本的分类算法。其主要原...

  • KNN算法:K最近邻分类算法(K-NearestNeighbor

    一、KNN算法概述 最近邻算法,或者说K最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类...

  • 深入浅出KNN算法(一) 介绍篇

    一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学...

  • KNN分类

    KNN分类的全称是K Nearest Neighbour,即K最近邻分类算法,其中的K表示最接近自己的K个数据样本...

  • KNN分类

    邻近算法(kNN,k-NearestNeighbor),是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k...

  • knn:分类

    1.knn思路 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本...

网友评论

      本文标题:KNN分类

      本文链接:https://www.haomeiwen.com/subject/iurfxqtx.html