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))]

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

目录
相关文章
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
128 1
|
1月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
189 1
|
1月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
302 0
|
1月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
121 0
|
2月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
253 101
|
2月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
173 98
|
1月前
|
数据可视化 关系型数据库 MySQL
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
本文详解基于Python的电影TOP250数据可视化大屏开发全流程,涵盖爬虫、数据存储、分析及可视化。使用requests+BeautifulSoup爬取数据,pandas存入MySQL,pyecharts实现柱状图、饼图、词云图、散点图等多种图表,并通过Page组件拖拽布局组合成大屏,支持多种主题切换,附完整源码与视频讲解。
171 4
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
|
1月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
271 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
23天前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
144 3
|
23天前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
311 3

推荐镜像

更多