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天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
1天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
3天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
2天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
1天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
3天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
3天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!
|
4天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
6天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
20 4
|
6天前
|
Python
不容错过!Python中图的精妙表示与高效遍历策略,提升你的编程艺术感
本文介绍了Python中图的表示方法及遍历策略。图可通过邻接表或邻接矩阵表示,前者节省空间适合稀疏图,后者便于检查连接但占用更多空间。文章详细展示了邻接表和邻接矩阵的实现,并讲解了深度优先搜索(DFS)和广度优先搜索(BFS)的遍历方法,帮助读者掌握图的基本操作和应用技巧。
21 4