Python实现简单的马尔科夫链

之前为了应对数学建模 ,就学了一些数学模型,就比如马尔科夫链。

以下就是我写的简单的马尔科夫链:

python 复制代码
from typing import Any ,NoReturn
from pprint import pprint


class MarkovChain(object):

    CACHE: dict[str : int] = {}

    #实现简单的缓存
    @classmethod
    def cache(cls ,target: Any) -> int|None:
        return cls.CACHE[target] if target in list(cls.CACHE) else None
        

    def __init__(self ,string: str) -> NoReturn:
        if not isinstance(string ,str) or not string:
            return

        self.__main_string: str = string

        
    #返回组合
    @property
    def permutations(self) -> iter:
        data_set: set = set(self.__main_string)
        return {(e1 ,e2) for e1 in data_set for e2 in data_set}


    #计算子字符串的个数
    def count_substring(self ,sub_string: str ,count:int = 0b0) -> int:
        if sub_string not in self.__main_string:
            return 0b0

        for index ,each in enumerate(range(len(self.__main_string)) ,start=0):
            if self.__main_string[index:index+0b10] == sub_string:
                count += 0b1
        else:
            return count


    #返回计算结果
    @property
    def data(self ,*args: tuple ,**kwargs: dict) -> dict:
        data: dict[str : int] = {}
        for index ,each in enumerate(self.permutations ,start=0):
            sub_name: str = ''.join(each)
            data[sub_name]: dict[str : int] = self.count_substring(sub_name)
        else:
            return data


    #计算分母
    def denominator(self ,substring: str) -> int:
        if (SUM := MarkovChain.cache(substring[0])) is not None:
            return SUM
        SUM: int = sum([item for index ,(key ,item) in enumerate(self.data.items()) if substring[0]==key[0]])
        MarkovChain.CACHE[substring[0]]: dict[str:int] = SUM
        return SUM


    #返回计算的比例
    @property
    def percentage(self) -> dict:
        return {key:each/self.denominator(key) for index ,(key ,each) in enumerate(self.data.items() ,start=0)}


def main(*args: tuple ,**kwargs: dict) -> NoReturn:
    for index ,each in enumerate(args ,start=1):
        print(f"{index}:")
        chain: MarkovChain = MarkovChain(string_data)
        pprint(chain.data)
        print()
        pprint(chain.percentage)
    else:
        print("OK!")
相关推荐
兵慌码乱6 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵7 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio11 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636712 小时前
使用 Python 从零创建 Word 文档
python
Csvn17 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽18 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户5569188175320 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱1 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei2 天前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python