KNN分类算法

这篇博客对比了使用机器学习实战中的KNN算法和scikit-learn库的KNN算法对手写数字进行分类的效率。发现在对0-9数字的识别任务中,scikit-learn的KNN算法执行速度较慢,而采用自定义的classify0方法则显著加快了分类速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:使用机器学习实战中的knn算法对 普通样本进行了分类

2:分别使用该算法与scikit_learning中的knn 进行了手写数字的对比,发现scikit_learning分类很慢

 

实现的功能:

    1、对样本特征为[x1,x2,.....,xn-1,y],其中共有n-1个特征,1个y标签 进行knn样本分类

 部分数据截图:

knn.py

import numpy as np
import operator

def classify0(inX, dataset, labels, k):
    """
    inX 是输入的测试样本,是一个[x1, x2,......]样式的
    dataset 是训练样本集
    labels 是训练样本标签
    k 是top k最相近的
    """
    dataSetSize = dataset.shape[0] 
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataset
    sqDiffMat = diffMat ** 2
    sqDistance = sqDiffMat.sum(axis=1)
    distance = sqDistance ** 0.5
    sortedDistIndicies = distance.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        #classCount.get(voteIlabel, 0) classCount中有 voteIlabel,则取出classCount[voteIlabel]的值,否则为置为0
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    #从大到小的排序
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    #返回[('B', 2), ('A', 1)]中最大的

    return sortedClassCount[0][0]

def file2matrix(filename):
    """
    从文件中读入训练数据,并存储为矩阵
    针对样本特征为n-1个样本特征,1个样本标签   [x1,x2,x3,....,xn-1,y]
    """
    fr = open(filename)
    arrayOlines = fr.readlines()
    numberOfLines = len(arrayOlines)   #获取 n=样本的行数
    
    numberOffeatures = len(arrayOlines[0].split('\t')) - 1
    print(numberOffeatures)

    returnMat = np.zeros((numberOfLines,numberOffeatures))   #创建一个2维矩阵用于存放训练样本数据,一共有n行,每一行存放3个数据
    classLabelVector = []    #创建一个1维数组用于存放训练样本标签。  
    index = 0
    for line in arrayOlines:
        # 把回车符号给去掉
        line = line.strip()    
        # 把每一行数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值