zoukankan      html  css  js  c++  java
  • python实现k近邻

    k近邻分类器大概想法是  在已知许多样本分好类的情况下,给定一个新样本i, 计算得到与i最接近的k个样本,那么假设这k个样本为a1, a2, ... , ak ,总共五个类别{1,2,3,4,5},

      其中就有{a1:3, a2:4, a3:1, ... ,  ak:2},a1 所对的值3 就为它的类别,现在如果在这个k个样本里,属于类别3 的样本最多,那么我们就可以把样本i 归为类别3

    现在来用python 简单实现下这个分类器

    首先定义一下数据集结构

    数据矩阵 X_train表示训练样本矩阵,y_train 表示训练样本的类别向量

    import numpy as np
    train = np.array(zip(X_train,y_train)) test = np.array(zip(X_test, y_test))

     那么求解这个分类器就可以归于以下几个步骤:

    1. 计算任意两个样本点的距离

    import math
    
    # 计算两点的欧式距离
    def distance(p1, p2):
        points = zip(p1, p2)#  使用zip迭代函数
        d = [pow(a - b, 2) for (a, b) in points]
        return math.sqrt(sum(d))

    2. 找出k个最接近邻居

    from operator import itemgetter
    def neighbours(trains, test, k):
        distances = [tuple_distance(train, test) for train in trains]# 输出形式[array([array([ 2.3, 3.4, 2.3]), 0], dtype=object)] 
        sort_d = sorted(distances, key=itemgetter(1))#根据距离来排列(key=itemgetter(1))
        sort_train= [a[0] for a in sort_d]#排列后的训练矩阵
        return sort_train[:k]# 选取前k个邻居样本
    def tuple_distance(train, test):
        return (train, get_distance(test, train[0]))#   (array([array([ 2.3, 3.4]), 0], dtype=object), 2.222333)

    3. 根据每个邻居的类别投票决定

    def vote(neighbours_matrix):
        classes = [neighbour[1] for neighbour in neighbours_matrix]#返回邻居的类别列表
        count = Counter(classes)  
        return count.most_common()[0][0]

    总的来说

    predictions = []
    for x in range(len(X_test)):
    
        neighbours = neighbours(train, test[x][0], 5)
        votes = vote(neighbours)
        predictions.append(votes)
        

    这样就可以得到测试样本的预测列表predictions ,好了。

  • 相关阅读:
    supervise 用来监控服务,自动启动
    tee -a /var/log/jd.log
    类的构造函数与析构函数的调用顺序
    c++之带默认形参值的函数
    zoj1001-A + B Problem
    zoj1037-Gridland
    cf499A-Watching a movie
    cf478B-Random Teams 【排列组合】
    C++版修真小说
    Python_12-线程编程
  • 原文地址:https://www.cnblogs.com/who-a/p/5651647.html
Copyright © 2011-2022 走看看