python-手写knn(k Nearest Neighbor) k近邻算法

原创 2017年06月19日 22:22:15

先上代码 附上测试集

!!!


# -*- coding:utf-8 -*-

import csv
import random
import math
import operator

# 文件名 分割比例  训练集 测试集
def loadDate(fileName, split, trainSet=[], testSet=[]):
    with open(fileName, 'rb') as csvfile:
        lines = csv.reader(csvfile)
        dataSet = list(lines)

        for i in range(len(dataSet)):  # 数值类型转化 以及分组
            for j in range(4):
                dataSet[i][j] = float(dataSet[i][j])
            if random.random() < split:
                testSet.append(dataSet[i])
            else:
                trainSet.append(dataSet[i])



# dimension-维度 计算两点的距离 拓展带各个维度
def calDistance(point, point2, dimension):
    distance = 0.0
    for i in range(dimension):  # 各个维度计算
        distance += pow((point[i] - point2[i]), 2)
    return math.sqrt(distance)


# 返回k近邻list
def getNeighbors(trainSet, testSingle, k):  # 训练集 测试实例  k临近
    distance = []
    length = len(testSingle) - 1
    for i in range(len(trainSet)):  # 与每个训练元素计算距离排序
        dist = calDistance(testSingle, trainSet[i], length)
        distance.append((trainSet[i], dist))  # distance 存放 对比的实例 与 两点距离
    distance.sort(key=operator.itemgetter(1))  # 对第二个元素(距离)排序
    
    neighbors = []
    for i in range(k):  # 前k个
        neighbors.append(distance[i][0])
    return neighbors


# 从前k个最近的点中找出预测答案 预测答案在训练集中
def getResponse(neighbors):
    dict = {}  # 字典中的答案 计数
    for i in range(len(neighbors)):
        ans = neighbors[i][-1]  # 训练数据中最后一个是预测答案
        if ans in dict:
            dict[ans] += 1
        else:
            dict[ans] = 1
    sortVec = sorted(dict.iteritems(), key=operator.itemgetter(1), reverse=True)  # 排序k个中出现次数最多的作为ans
    return sortVec[0][0]


 # 测试 与 预测比对正确率
def getOk(testSet, preSet):
    correct = 0
    for i in range(len(testSet)):
        if testSet[i][-1] == preSet[i]:
            correct += 1
    return (correct / float(len(testSet))) * 100.0


if __name__ == '__main__':

    trainSet = []  # 训练集
    testSet = []   # 测试集
    split = 0.67   # 分割比例  可以来自两个文件 可以不需要分割
    k = 1          # ~~k近~~
    preAnsSet = []    # 预测结果

    loadDate(r'F:\knnData.txt', split, trainSet, testSet)
    for i in range(len(testSet)):
        neighbors = getNeighbors(trainSet, testSet[i], k)  # 测试每个testSet与trainSet的最近的k个点
        res = getResponse(neighbors)  # 得到预测结果答案
        preAnsSet.append(res)

    acc = getOk(testSet, preAnsSet)  # 得到准确率
    print len(testSet)
    print len(trainSet)  # 各种数据集大小
    print ("ok rate %.2f%%") % acc  # ac率

"""
前四列是坐标,最后一列是答案:分类
F:\knnData.txt

5.1,3.5,1.4,0.2,0
4.9,3. ,1.4,0.2,0
4.7,3.2,1.3,0.2,0
4.6,3.1,1.5,0.2,0
5. ,3.6,1.4,0.2,0
5.4,3.9,1.7,0.4,0
4.6,3.4,1.4,0.3,0
5. ,3.4,1.5,0.2,0
4.4,2.9,1.4,0.2,0
4.9,3.1,1.5,0.1,0
5.4,3.7,1.5,0.2,0
4.8,3.4,1.6,0.2,0
4.8,3. ,1.4,0.1,0
4.3,3. ,1.1,0.1,0
5.8,4. ,1.2,0.2,0
5.7,4.4,1.5,0.4,0
5.4,3.9,1.3,0.4,0
5.1,3.5,1.4,0.3,0
5.7,3.8,1.7,0.3,0
5.1,3.8,1.5,0.3,0
5.4,3.4,1.7,0.2,0
5.1,3.7,1.5,0.4,0
4.6,3.6,1. ,0.2,0
5.1,3.3,1.7,0.5,0
4.8,3.4,1.9,0.2,0
5. ,3. ,1.6,0.2,0
5. ,3.4,1.6,0.4,0
5.2,3.5,1.5,0.2,0
5.2,3.4,1.4,0.2,0
4.7,3.2,1.6,0.2,0
4.8,3.1,1.6,0.2,0
5.4,3.4,1.5,0.4,0
5.2,4.1,1.5,0.1,0
5.5,4.2,1.4,0.2,0
4.9,3.1,1.5,0.1,0
5. ,3.2,1.2,0.2,0
5.5,3.5,1.3,0.2,0
4.9,3.1,1.5,0.1,0
4.4,3. ,1.3,0.2,0
5.1,3.4,1.5,0.2,0
5. ,3.5,1.3,0.3,0
4.5,2.3,1.3,0.3,0
4.4,3.2,1.3,0.2,0
5. ,3.5,1.6,0.6,0
5.1,3.8,1.9,0.4,0
4.8,3. ,1.4,0.3,0
5.1,3.8,1.6,0.2,0
4.6,3.2,1.4,0.2,0
5.3,3.7,1.5,0.2,0
5. ,3.3,1.4,0.2,0
7. ,3.2,4.7,1.4,1
6.4,3.2,4.5,1.5,1
6.9,3.1,4.9,1.5,1
5.5,2.3,4. ,1.3,1
6.5,2.8,4.6,1.5,1
5.7,2.8,4.5,1.3,1
6.3,3.3,4.7,1.6,1
4.9,2.4,3.3,1.,1
6.6,2.9,4.6,1.3,1
5.2,2.7,3.9,1.4,1
5. ,2. ,3.5,1.,1
5.9,3. ,4.2,1.5,1
6. ,2.2,4. ,1.,1
6.1,2.9,4.7,1.4,1
5.6,2.9,3.6,1.3,1
6.7,3.1,4.4,1.4,1
5.6,3. ,4.5,1.5,1
5.8,2.7,4.1,1.,1
6.2,2.2,4.5,1.5,1
5.6,2.5,3.9,1.1,1
5.9,3.2,4.8,1.8,1
6.1,2.8,4. ,1.3,1
6.3,2.5,4.9,1.5,1
6.1,2.8,4.7,1.2,1
6.4,2.9,4.3,1.3,1
6.6,3. ,4.4,1.4,1
6.8,2.8,4.8,1.4,1
6.7,3. ,5. ,1.7,1
6. ,2.9,4.5,1.5,1
5.7,2.6,3.5,1.,1
5.5,2.4,3.8,1.1,1
5.5,2.4,3.7,1.,1
5.8,2.7,3.9,1.2,1
6. ,2.7,5.1,1.6,1
5.4,3. ,4.5,1.5,1
6. ,3.4,4.5,1.6,1
6.7,3.1,4.7,1.5,1
6.3,2.3,4.4,1.3,1
5.6,3. ,4.1,1.3,1
5.5,2.5,4. ,1.3,1
5.5,2.6,4.4,1.2,1
6.1,3. ,4.6,1.4,1
5.8,2.6,4. ,1.2,1
5. ,2.3,3.3,1.,1
5.6,2.7,4.2,1.3,1
5.7,3. ,4.2,1.2,1
5.7,2.9,4.2,1.3,1
6.2,2.9,4.3,1.3,1
5.1,2.5,3. ,1.1,1
5.7,2.8,4.1,1.3,1
6.3,3.3,6. ,2.5,2
5.8,2.7,5.1,1.9,2
7.1,3. ,5.9,2.1,2
6.3,2.9,5.6,1.8,2
6.5,3. ,5.8,2.2,2
7.6,3. ,6.6,2.1,2
4.9,2.5,4.5,1.7,2
7.3,2.9,6.3,1.8,2
6.7,2.5,5.8,1.8,2
7.2,3.6,6.1,2.5,2
6.5,3.2,5.1,2.,2
6.4,2.7,5.3,1.9,2
6.8,3. ,5.5,2.1,2
5.7,2.5,5. ,2.,22
5.8,2.8,5.1,2.4,2
6.4,3.2,5.3,2.3,2
6.5,3. ,5.5,1.8,2
7.7,3.8,6.7,2.2,2
7.7,2.6,6.9,2.3,2
6. ,2.2,5. ,1.5,2
6.9,3.2,5.7,2.3,2
5.6,2.8,4.9,2.,2
7.7,2.8,6.7,2.,2
6.3,2.7,4.9,1.8,2
6.7,3.3,5.7,2.1,2
7.2,3.2,6. ,1.8,2
6.2,2.8,4.8,1.8,2
6.1,3. ,4.9,1.8,2
6.4,2.8,5.6,2.1,2
7.2,3. ,5.8,1.6,2
7.4,2.8,6.1,1.9,2
7.9,3.8,6.4,2.,2
6.4,2.8,5.6,2.2,2
6.3,2.8,5.1,1.5,2
6.1,2.6,5.6,1.4,2
7.7,3. ,6.1,2.3,2
6.3,3.4,5.6,2.4,2
6.4,3.1,5.5,1.8,2
6. ,3. ,4.8,1.8,2
6.9,3.1,5.4,2.1,2
6.7,3.1,5.6,2.4,2
6.9,3.1,5.1,2.3,2
5.8,2.7,5.1,1.9,2
6.8,3.2,5.9,2.3,2
6.7,3.3,5.7,2.5,2
6.7,3. ,5.2,2.3,2
6.3,2.5,5. ,1.9,2
6.5,3. ,5.2,2.,2
6.2,3.4,5.4,2.3,2
5.9,3. ,5.1,1.8,2

"""


knn其实很好理解 

因为在机器学习实战中....是第一讲???

然后python实现详见代码垃圾注释


主要思路

枚举待预测的点 与 训练集各个点的距离

然后取距离前k的点(这k个点是训练集的点 有确切答案)

根据少数服从多数原则进行判断结果

over

各个函数功能简单粗暴 见注释

然后恭喜手敲AC rate 0.87

恭喜照抄理解AC rate 0.96

嗯 明天上提交传代码

(代办清单:爬虫,图像识别,更新后删除括号内内容)

版权声明:有错误麻烦赐教,感激不尽~~~(转载留言哦~)

2_6最近邻算法kNN(k_nearest_neighbor)——handwritingClassTest_2_6

声明:《机器学习实战》代码详细注释和重构,以及相关的函数、模块和算法的解释;本文为博主原创文章,未经博主允许不得转载。 手写数字识别系统的测试代码(程序清单2-6) *#代码:Peter Gong_...

2_5最近邻算法kNN(k_nearest_neighbor)——classifyPerson_2_5

声明:《机器学习实战》代码详细注释和重构,以及相关的函数、模块和算法的解释;本文为博主原创文章,未经博主允许不得转载。 约会网站预测函数(程序清单2-5) *#代码:Peter Gong_shuai...

2_2最近邻算法kNN(k_nearest_neighbor)——file2matrix_2_2

声明:《机器学习实战》代码详细注释和重构,以及相关的函数、模块和算法的解释;本文为博主原创文章,未经博主允许不得转载。1.k-近邻算法(程序清单2-2)*#代码:Peter Gong_shuai ...

2_1最近邻算法kNN(k_nearest_neighbor)——classify0_2_1

声明:《机器学习实战》代码详细注释和重构,以及相关的函数、模块和算法的解释;原创博客,转载或者使用内容,请申明,并且争得本人同意!1。#k-近邻算法(程序清单2-1) *#代码:Peter Gon...

2_3最近邻算法kNN(k_nearest_neighbor)——autoNorm_2_3

声明:《机器学习实战》代码详细注释和重构,以及相关的函数、模块和算法的解释;本文为博主原创文章,未经博主允许不得转载。1.k-近邻算法(程序清单2-3) *#代码:Peter Gong_shuai ...

MachineLearning— (KNN)k Nearest Neighbor实现手写数字识别(三)

本篇博文主要结合前两篇的knn算法理论部分knn理论理解(一)和knn理论理解(二),做一个KNN的实现,主要是根据《机器学习实战》这本书的内容,一个非常经典有趣的例子就是使用knn最近邻算法来实现对...

python3与机器学习实践---1、最简单的K-邻近算法(k-Nearest Neighbor,KNN)

k-邻近算法原理简述: k-邻近算法就是通过计算待分类数据与样本数据间距离,获取样本中前k个(通常不大于20个)与待分类数据最相近的数据,然后再分类统计这个k个数据,把待分类数据归类到出现次数最多的分...

机器学习实战—k近邻算法(kNN)03-手写识别系统

使用k-近邻算法的手写识别系统  这里构造的系统只能识别数字0~9。   需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:宽高是32像素×32像素的黑白图像。示例:使用k-近邻算法的...

机器学习笔记(一)k近邻算法(k-Nearest Neighbor)

k近邻算法(kNN)是监督学习的一种。其原理非常简单:存在一个样本数据集,也称作训练样本集。样本集中的每个数据都存在标签,即知道数据与对应分类的关系。输入新的没有标签的数据,将新的数据的每个特征与样本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python-手写knn(k Nearest Neighbor) k近邻算法
举报原因:
原因补充:

(最多只允许输入30个字)