Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现

简介: Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现



1. 导读

本文将带领大家实现写两种选择器。所谓选择器,指的是,给定一个元素容器,从该容器种依据一定的策,选取某类或某个特定的元素返回,以作为选择的结果

【note】这几个挑选器可供实现"决策树"算法中,当使用预剪枝策略停止分裂时,挑选出一个提前结束决策树叶节点的lable。

(1)一种称之为“众数投票器”,顾名思义是按照以容器(Collection)中不同元素出现的次数作为依据,选出现次数最多的那一个元素返回。

(2)第二种为“随机挑选器

  • 首先是简单随机挑选器,就是不论各个元素在容器中的出现频率如何,随机返回其中的一个元素。应该指出这是一种“按元素类权重的随机挑选器”。当容器不进行去重时,以各个元素所占的比重为它们在一次随机抽取中被抽中的概率,随机地挑选一个值出来。但实际上这种就是第二种。因为在第二种挑选器中,由于是随机选取一个元素,占比大的元素拥有更大的被选中的可能性,并且在没有附加条件的前提下,即只要元素是随机分布的一类元素被选中的概率和它在容器中出现次数成正比,因此对于非去重随机选取的本质就是按照比重选取。
  • 进一步,然后是完全随机挑选器。与上面的简单随机挑选器不同之处在于完全随机挑选器所有元素类等可能地被挑选出,而上面直接简单地对所有元素进行随机挑选是不用考虑到元素出现权重不同所带来地干扰地。之所以我称之为完全随机,因为这样挑选对于一类而言,它随机得更彻底。

2.众数挑选器

2.1 collections.Counter 简介

为了方便,我们使用Python内建模块collections 中的计数器对象Counter

它的most_common()方法可以计算出各个元素的出现次数,并按照出现次数的大小顺序返回。

比如由列表(List)转为Counter对象:

from collections import Counter
label = ['A',6,'B','A',6,'A']
Counter(label)

Out[i]:Counter({‘A’: 3, 6: 2, ‘B’: 1})

获取Counter对象中的按顺序排列列表:

Counter(label).most_common()

Out[i]:[(‘A’, 3), (6, 2), (‘B’, 1)]

可以看到,这个列表是由若干个元组构成的,每个元组的前一个元素即为原列表中的元素,元组的第二个元素为对应在原列表中的出现次数。并且所有元组在most_common()方法返回的列表中是按照出现次数由多到少排列的。

Counter对象在本质上它也是一个容器。我们也可以使用出栈方法popitem()弹出其栈顶元素,也就是出现次数最少的,比如:

Counter(label).popitem(label)

Out[i]:(‘B’, 1)

不过popitem()方法与pop方法是不同的,pop()方法用于获取指定元素的出现次数:

Counter(label).pop(6)

Out[i]:2

再了解了Counter计数器这个知识点之后,我们就来看统计容器中的总数吧。

2.2 众数挑选器的Python代码

from collections import Counter
def majorityLabel(labels):
    """
    众数投票器
    求取某个节点出现次数最多的标签
    Parameters
    ----------
    labels:    an Array-like object
    Return
    ------
    result:    labels中出现次数最多的那个成员
    """
    return Counter(list(labels)).most_common()[0][0]

3.随机挑选器

3.1 简单随机挑选器(元素随机挑选器)

——(所有元素等可能地被挑选出)

在数理统计中,所谓随机是没有任何理由或信息认为任意一个元素的出现概率比其它元素大。实际上不论一个元素里面的值是如何排列的,有序也好无需也罢,只要产生一个随机数任意选出一个元素即可让所有元素等可能地被选出来。如此挑选,一类元素被选中的概率只取决于该类元素在容器中的数量。

import random
# random.seed(RANDOM_SEED) # 如果向固定随机种子让“随机”不再随机,则取消本条注释并给定RANDOM_SEED的值
def maxProbability_elem(labels):
    """
    按比重随机投票器
    从以标签容器labels中随机返回一个元素
    Parameters
    ----------
    labels:    an Array-like object
    Return
    ------
    result:    labels 中的某个成员
    """
    return labels[int(random.random()* len(labels))]

3.2 完全随机挑选器(类随机挑选器)

——(所有元素类等可能地被挑选出)

相比于2.1,为了使得元素种所有类别被挑选出来地概率相同,需要做的不过是使得所有元素都拥有相同地权重。做到这一点嘴贱但地方式就是对元素进行去重,使得所有元素地权重值都为1。而去重地最简单方式就是转为"集合(set)"。

实现入下:

import random
# random.seed(RANDOM_SEED) # 如果向固定随机种子让“随机”不再随机,则取消本条注释并给定RANDOM_SEED的值
def maxProbability_class(label):
    """
    按比重随机投票器
    对标签容器labels的元素进行去重,再随机返回一个其中的一个元素
    Parameters
    ----------
    labels:    an Array-like object
    Return
    ------
    result:    labels 中的某个成员
    """
    return list(set(listlabel))[int(random.random()* len(listlabel))]

4. 小结

from collections import Counter
class Selector(object):
    """选择器"""
    def __init__(self):
        """
        Parameters
        ----------
        labels:    an Array-like object
        """
        self.labels = labels
    def majorityLabel(self):
        """
        选择出现次数最多的元素
        Return
        ------
        result:    labels中出现次数最多的那个成员
        """
        return Counter(list(self.labels)).most_common()[0][0]
    def maxProbability_elem(self):
        """
        有元素权重随机选择(元素随机)
        Return
        ------
        result:    labels 中的某个成员
        """
        return self.labels[int(random.random()* len(self.labels))]
    def maxProbability_class(self):
        """
        无元素权重随机选择(元素类随机)
        Return
        ------
        result:    labels 中的某个成员
        """
        return list(set(self.labels))[int(random.random()* len(self.labels))]

如果喜欢,记得一赞三连噢!

目录
相关文章
|
8天前
|
XML JSON 数据库
Python的标准库
Python的标准库
121 77
|
14天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
42 18
|
6天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
37 8
|
9天前
|
XML JSON 数据库
Python的标准库
Python的标准库
38 11
|
9天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
48 8
|
15天前
|
Python
Python中的函数
Python中的函数
31 8
|
17天前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
28 4
|
15天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
14天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
97 80