机器学习与数据挖掘系列算法之--knn的python实现(代码片段)

疯孑456258 疯孑456258     2023-02-03     537

关键词:

K近邻算法原理较为简单,不多介绍,直接上python实现,有什么疑问或错误的地方敬请指出探讨,谢谢。

Knn.py
from algorithm.classification.common.PredictBase import PredictBase
from algorithm.classification.common import Utils
# author:chenhq
# create date:2017/12/8

'''
    K近邻算法:
        思想:基于最近k个样例的分类,分类最多的类别即为该类确定的类别,以下为加权k近邻算法
        步骤:
            1.计算x与所有样本X的距离,取topK近邻样本
            2.y = argmax(j)∑[1/dis(x,xi)*I(yi = yj)], i∈topK
                *: I(yi = yj) -> 指示函数,true->1, false->0
'''


class Knn(PredictBase):
    def __init__(self):
        self.sample = []
        self.labels = []
        self.k = 5

    def train_set(self, train_data, class_vec, k):
        self.sample = train_data
        self.labels = class_vec
        self.k = k

    def predict(self, row):
        dis_list = [(self.dis(vec, row), label) for (vec, label) in list(zip(self.sample, self.labels))]
        top_k = sorted(dis_list, key=lambda d: d[0])[:self.k]
        label_dict = 
        [label_dict.update(label: label_dict.get(label, 0) + 1.0 / (distance + 1))for (distance, label) in top_k]
        return sorted(label_dict.items(), key=lambda ld: -ld[0])[0]

    def dis(self, vec1, vec2):
        s = 0.0
        for (v1, v2) in zip(vec1, vec2):
            s += pow((v1 - v2), 2)
        return pow(s, 0.5)

if __name__ == '__main__':
    # load_data-->split(train&test)
    source_data, class_vec = Utils.load_classify_data_set()
    train_data, train_class_vec, eva_data, eva_class_vec = Utils.split_data(source_data, class_vec, 0.8)
    print(eva_data, eva_class_vec)

    # train & evaluate & show
    model = Knn()
    model.train_set(train_data=train_data, class_vec=train_class_vec, k=5)
    prediction, recall, f = model.evaluate(evaluate_set=eva_data, evaluate_label=eva_class_vec)
    print("prediction:\\t%f\\nrecall:\\t%f\\nf-measure:\\t%f" % (prediction, recall, f))


相关的基类及辅助方法

PredictBase.py
class PredictBase(object):
    # __metaclass__ = ABCMeta #指定这是一个抽象类

    def evaluate(self, evaluate_set, evaluate_label):
        evaluate_list = list()
        for (features, label) in list(zip(evaluate_set, evaluate_label)):
            p_max = self.predict(features)
            evaluate_list.append((label, p_max[0]))
        tp = 0      # true-positive     真-->真
        fp = 0      # false-positive    假-->真
        fn = 0      # false-negative    真-->假
        tn = 0      # true-negative     假-->假
        for (label, predict_label) in evaluate_list:
            if label == 1:
                if predict_label == 1:
                    tp += 1
                else:
                    fn += 1
            else:
                if predict_label == 1:
                    fp += 1
                else:
                    tn += 1
        if tp == 0:
            return 0, 0, 0
        prediction = float(tp) / (tp + fp)
        recall = float(tp) / (tp + fn)
        f = 2 * prediction * recall / (prediction + recall)
        return prediction, recall, f

    def predict(self, row):
        pass

Utils.py
def split_data(data, label, rate):
    train_lens = int(len(label) * 0.9)
    (train_data, train_class_vec) = (data[0: train_lens], label[0: train_lens])
    (eva_data, eva_class_vec) = (data[train_lens:], label[train_lens:])
    return train_data, train_class_vec, eva_data, eva_class_vec


# 准数据
def load_classify_data_set():
    source_data = [[7, 8, 10, 8, 6, 10, 1, 2, 0, 2, 1, 1],
                   [0, 1, 1, 2, 2, 1, 8, 9, 9, 9, 7, 8],
                   [0, 0, 2, 2, 2, 1, 8, 9, 9, 9, 7, 8],
                   [7, 8, 7, 8, 7, 8, 1, 2, 0, 2, 1, 1],
                   [0, 0, 1, 3, 2, 1, 8, 9, 9, 9, 7, 8],
                   [0, 2, 1, 2, 2, 1, 8, 9, 9, 9, 7, 8],
                   [0, 0, 1, 2, 4, 1, 8, 9, 9, 9, 7, 8],
                   [7, 9, 10, 8, 6, 9, 1, 2, 0, 2, 1, 1],
                   [1, 0, 1, 2, 2, 1, 8, 9, 9, 9, 7, 8],
                   [7, 7, 9, 8, 6, 8, 1, 2, 0, 2, 1, 1],
                   [7, 9, 9, 8, 9, 0, 11, 2, 0, 2, 1, 1],
                   [7, 8, 9, 8, 6, 9, 1, 2, 0, 2, 2, 1],
                   [0, 0, 1, 4, 2, 1, 8, 9, 9, 9, 7, 8],
                   [8, 8, 9, 8, 8, 5, 1, 2, 0, 2, 1, 0],
                   [7, 8, 9, 8, 6, 5, 1, 2, 0, 2, 0, 1],
                   [0, 0, 3, 2, 2, 1, 8, 9, 9, 9, 7, 8],
                   [7, 8, 9, 8, 6, 9, 1, 2, 0, 2, 2, 1],]
    class_vec = [1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1]
    return source_data, class_vec


机器学习算法(knn)(代码片段)

KNN简介KNN(k-NearestNeighbor)算法的思想总结一下:就是在数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个... 查看详情

机器学习十大算法之knn(k最近邻,k-nearestneighbor)算法

机器学习十大算法之KNN算法前段时间一直在搞tkinter,机器学习荒废了一阵子。如今想重新写一个,发现遇到不少问题,不过最终还是解决了。希望与大家共同进步。闲话少说,进入正题。KNN算法也称最近邻居算法,是一种分类算... 查看详情

常见机器学习算法原理+实践系列5(knn分类+keans聚类)

一,KNN分类K-NearestNeighborK临近算法是一种有监督的分类算法,工作原理很简单,存在一个样本集合,也成为训练样本,样本中包含标签,将新数据的每个特征与样本集合的数据对应特征进行比较,然后提取样本最相似的分类标签... 查看详情

以❤️简单易懂❤️的语言带你搞懂有监督学习算法附python代码详解机器学习系列之knn篇(代码片段)

必须要看的前言本文风格:以❤️简单易懂❤️的语言带你彻底搞懂KNN,了解什么是有监督学习算法。认真看完这篇文章,彻底了解KNN、了解监督学习算法绝对是一样很简单的事情。注:本篇文章非常详细,... 查看详情

机器学习实战之knn

   笔者最近开始对机器学习非常感兴趣,作为一个有志向的软设方向的女孩纸,我开始了学习的第一步入门,下面将今天刚刚学习的kNN及其应用进行总结和回顾,希望可以得到更好的提升,当然,有志同道合者,你可... 查看详情

机器学习实战knn

 $k$-近邻算法(kNN)的工作原理:存在一个训练样本集,样本集中的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对于关系。输入没有标签的新数据后,将新数据的每一个特征与样本集中数据对应的特征... 查看详情

机器学习实战之knn算法

   机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少:(1)python3.52,64位,这是我用的python版本(2)numpy1.11.3,64位,这是python的科学计算包,是python的一个矩阵类型,包含... 查看详情

阿旭机器学习实战33中文文本分类之情感分析--朴素贝叶斯knn逻辑回归(代码片段)

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。目录1.查看原始数据结构2.导入数据并进行数据处理2.1提取数据与标签2.2过滤停用词2.3TfidfVectorizer将文本向... 查看详情

人工智能之knn算法(代码片段)

...-kNN.html基于python实现的KNN算法邻近算法(k-NearestNeighbor)是机器学习中的一种分类(classification)算法,也是机器学习中最简单的算法之一了。虽然很简单,但在解决特定问题时却能发挥很好的效果。因此,学习kNN算法是机器学习... 查看详情

监督学习算法_k-近邻(knn)分类算法_源代码

因为自己想学着去写机器学习的源码,所以我最近在学习《机器学习实战》这本书。《机器学习实战》是利用Python2完成的机器学习算法的源代码,并利用机器学习方法来对实际问题进行分析与处理。(《机器学习实战》豆瓣读... 查看详情

机器学习实战之第二章k-近邻算法

第2章k-近邻算法KNN概述k-近邻(kNN,k-NearestNeighbor)算法主要是用来进行分类的.KNN场景电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢?动作片:打斗次数更多爱情片:亲吻次数更多基于电影中的亲吻、... 查看详情

数据挖掘之knn算法(c#实现)

在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种。该算法是一种惰性学习法(lazylearner),与决策树、朴素贝叶斯这些急切学习法(eagerlearner)有所区别。惰性学习法仅仅只是简单地存储训练元组,做一些少量工作... 查看详情

机器学习算法之knn最近邻详解和python实现(代码片段)

作者:RayChiu_Labloy版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处目录概念KNN相关的三个事情 1.K值的确定2.距离的度量计算距离注意一定要做数据缩放:归一化和标准化3.... 查看详情

hulu机器学习问题与解答系列|十七:随机梯度下降算法之经典变种

这是本周第二篇机器学习,也是Hulu面试题系列的第十七篇了~之前的所有内容都可以在菜单栏的“机器学习”中找到,愿你温故,知新。 今天的内容是【随机梯度下降算法之经典变种】 场景描述提到DeepLearning中的优化方... 查看详情

机器学习机器学习分类算法--k近邻算法knn(下)(代码片段)

六、网格搜索与K邻近算法中更多的超参数七、数据归一化FeatureScaling解决方案:将所有的数据映射到同一尺度      八、scikit-learn中的Scalerpreprocessing.pyimportnumpyasnpclassStandardScaler:def__init__(self):self.mean_=None 查看详情

常用机器学习算法knn原理与实践

推荐两篇讲解与实践KNN比较好博客,感谢原作者总结http://blog.csdn.net/u012162613/article/details/41768407http://www.cnblogs.com/ybjourney/p/4702562.html 查看详情

机器学习实战☛k-近邻算法(k-nearestneighbor,knn)(代码片段)

机器学习实战☛k-近邻算法(K-NearestNeighbor,KNN)文章目录机器学习实战☛k-近邻算法(K-NearestNeighbor,KNN)k-近邻算法概述原理简介k-近邻算法一般流程伪代码与实现示例:使用kNN改进约会网站的配对效... 查看详情

大数据经典算法解析(8)一knn算法

...算法,其数学原理又是如何?【嵌牛正文】:1.引言顶级数据挖掘会议ICDM于2006年12月评选出了数据挖掘领域的十大经典算法:C4.5,k-Means,SVM,Apriori,EM,PageRank,AdaBoost,kNN,NaïveBayes与CART。以前看过关于这些数据挖掘算法,但对背后数... 查看详情