信息论与编码 python实现 费诺编码 代码详解
先给出整体代码 要copy的朋友可以拿去
下面给出
from math import *
class FanoCod: #费诺编码code_dict = {}x_p = {}x_plist = []AvgCodeLength = 0CodingEfficiency = 0def sort(self,data:str):# 统计信源中各个概率self.x_p = {} # 一个信源和概率对应的字典x_list = []for i in data:if i not in x_list:x_list.append(i)length = len(data)for i in x_list:self.x_p[i] = data.count(i) / length# 对概率进行降序排序 并返回一个列表self.x_plist = sorted(self.x_p.items(), key=lambda kv: (kv[1], kv[0])) # 直接百度找来的字典跟据值进行排序self.x_plist=self.x_plist[::-1]# 更新码字表的字典值for i in self.x_plist:self.code_dict[i[0]]=''# 返回一个列表 列表元素是一个元组 元组有两个东西组成,分别是字符和概率return self.x_plistdef GeneratedCodeWord(self,list1):if len(list1)!=1:length=len(list1)pos = self.getIndex(list1) # 获取最佳分组点left = list1[0:pos + 1]right = list1[pos + 1:]#加0或1for i in range(0,length):if i<=pos:self.code_dict[list1[i][0]]+='0'else:self.code_dict[list1[i][0]]+='1'#递归self.GeneratedCodeWord(left)self.GeneratedCodeWord(right)def getAvgCodeLength(self):sum=0for i in self.code_dict:length=len(self.code_dict[i])sum+=length*self.x_p[i]self.AvgCodeLength=sumreturn sumdef getCodingEfficiency(self):Hx=0for i in self.x_plist:Hx+=-i[1]*log(i[1],2)self.CodingEfficiency=Hx/self.AvgCodeLengthreturn self.CodingEfficiencydef getIndex(self,list1):temp = []for i in range(0, len(list1) - 1):left = 0right=0for j in range(0, i + 1):left += self.x_plist[j][1]for k in range(i+1,len(list1)):right+=self.x_plist[k][1]temp.append(abs(left-right))return temp.index(min(temp))if __name__=='__main__':print("{:-^20}".format("费诺编码"))data = '1111222334'费诺=FanoCod()x_plist= 费诺.sort(data)费诺.GeneratedCodeWord(x_plist)print("平均码长为:%f" % 费诺.getAvgCodeLength())print("编码效率为:%f" % 费诺.getCodingEfficiency())print(费诺.code_dict)
1.先将输入的消息排序
统计所有输入计算概率 然后从大到小排序
从大到小排序先
def sort(self,data:str):# 统计信源中各个概率self.x_p = {} # 一个信源和概率对应的字典x_list = []for i in data:if i not in x_list:x_list.append(i)length = len(data)for i in x_list:self.x_p[i] = data.count(i) / length# 对概率进行降序排序 并返回一个列表self.x_plist = sorted(self.x_p.items(), key=lambda kv: (kv[1], kv[0])) # 直接百度找来的字典跟据值进行排序self.x_plist=self.x_plist[::-1] # 降序# 这里得到的x_plist的形式为[('1', 0.5), ('2', 0.3), ('3', 0.2)] 排序把字典转换为了对应的元组列表# 创建码字表的字典值for i in self.x_plist:self.code_dict[i[0]]=''# 返回一个列表 列表元素是一个元组 元组有两个东西组成,分别是字符和概率return self.x_plist
接下来就是递归生成码表
这里我一直想要用循环实现,但是研究了好长时间放弃了循环的想法 还是递归香
但是理论上能有递归就可以用循环,希望哪位写出用循环代码的大佬能分享下
def GeneratedCodeWord(self,list1):if len(list1)!=1:length=len(list1)pos = self.getIndex(list1) # 获取最佳分组点left = list1[0:pos + 1]right = list1[pos + 1:]#加0或1for i in range(0,length):if i<=pos:self.code_dict[list1[i][0]]+='0'else:self.code_dict[list1[i][0]]+='1'#递归self.GeneratedCodeWord(left)self.GeneratedCodeWord(right)def getIndex(self,list1): #获取最佳分组位置的函数temp = [] #存放每次for i in range(0, len(list1) - 1):left = 0right=0for j in range(0, i + 1): #这里最起码要循环一次所以 右边界为i+1left += self.x_plist[j][1] #计算左边和for k in range(i+1,len(list1)):right+=self.x_plist[k][1] #计算右边和temp.append(abs(left-right)) #计算差的绝对值return temp.index(min(temp)) #利用python的函数获取最小值所对用的位置
然后就是求编码效率和平均码长了
编码效率公公式
这个函数写的就很容易看懂了这里就不讲了
信息论与编码 python实现 费诺编码 代码详解相关推荐
- 费诺编码实验报告c语言,信息论编码实验报告费诺编码附源代码..doc
信息论编码实验报告费诺编码附源代码. 中南大学 信息论与编码实验报告 选 题: 费诺编码 学生姓名: 学 号: 专业班级: 通信工程 指导老师: 学 院: 信息科学与工程学院 时 间: 2015 目录 ...
- java实现.费诺编码_信息论编码实验报告费诺编码附源代码
信息论编码实验报告费诺编码附源代码 中南大学信息论与编码实验报告选 题: 费诺编码 学生姓名: 学 号: 专业班级: 通信工程 指导老师: 学 院: 信息科学与工程学院 时 间: 2015 目录1.实 ...
- python之汉诺塔问题详解
#汉诺塔问题 传说古老印度在一个圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片圣庙,一块黄铜板上插着三根宝石针.印度教的主神梵 ...
- python命令行大全-用什么库写 Python 命令行程序(示例代码详解)
一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...
- python 代码命令大全-用什么库写 Python 命令行程序(示例代码详解)
一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...
- python中欧拉-罗德里格斯的代码详解
我们可以在python中定义以下函数来完成三维和四维的罗德里格斯公式的数值计算,即统一了旋转运动和一般螺旋运动的Euler-Rodrigues公式: R = e θ A s = I + s i n θ ...
- python 图像语义分割mIOU代码详解
mIOU公式在此不赘述. 1.fast_hist(label.flatten(), pred.flatten(), num_classes) 2.生成关于像素的混淆矩阵 k = (a >= 0) ...
- Python VTK 球体贴图代码详解(二)
效果 继昨天的柱体代码学习,之后尝试了一把球体并进行贴图,效果如下: 代码 代码是在昨天柱体基础上修改成球体,并针对球体贴图多了两步: import vtk# *************柱体***** ...
- 费诺码设计matlab,费诺编码的matlab实现.doc
费诺编码的matlab实现.doc 多媒体技术实验报告学院:城南学院 姓名:学号:指导老师:尹波时间:2015年11月25日 教师评语:成绩 评阅教师 日期 实验一:费诺编码的matlab实现1实验目 ...
最新文章
- 神经科学中的数学之美
- SqlServer学习笔记【暂】
- 20应用统计考研复试要点(part13)--应用多元分析
- LeetCode(1029)——两地调度(JavaScript)
- CCF NOI1170 质因数分解
- Lattice Diamond 学习总结---“疑难杂症”杂篇
- 【实用技巧】下载音乐到本地电脑
- 教你用illustrator画十二色环
- 伟大的数学思想家—黎曼
- Hyperledger Fabric 管理链码 peer lifecycle chaincode 指令使用
- idea中translation插件显示网络异常(试一试)
- 实现微信自定义分享网页(java)
- Java SE基础(更新中)
- 【微信小程序】首行缩进、 去掉/取消首行缩进
- C++ 大作业 记账本
- 64位系统office Excel 2007导入oracle数据库出错问题解决
- 关于发那科机器人点焊故障处理方法
- 图谱实战 | 阿里新零售多模态知识图谱AliMe MKG的建设与应用
- 神经网络量化入门--Add和Concat
- [HTML5CSS3]20 个酷炫 应用及源码
热门文章
- pandas数据处理基础——筛选指定行或者指定列的数据
- 手把手教做Excel直方图
- FFmpeg和RTMP结合编译
- 关于c3p0报错:An attempt by a client to checkout a Connection has timed out.
- PDF应该怎么转换成Excel文档呢?
- Allocate exception for servlet LoginServletjava.lang.ClassNotFoundException:
- Flutter的android项目跳转谷歌市场
- tensorfow/model下object_detection训练错误记录
- 快速提取过火区域,卫星影像评估西昌山火方法初探
- 【CVPR2021】【语义编辑】SeFa(Closed-Form Factorization of Latent Semantics in GANs)论文分析