主頁 >  其他 > 資訊論篇-第一次上機作業,你好!

資訊論篇-第一次上機作業,你好!

2021-04-04 13:14:45 其他

在這里插入圖片描述

資訊論第一次上機作業


1.影像信源熵的求解

讀入一幅影像,實作求解圖片信源的熵,

'''
1.影像信源熵的求解
讀入一幅影像,實作求解圖片信源的熵,
'''
import math
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

#獲取一個數字陣列中的陣列,以np.matrix形式輸出,原陣列
def get_strlist_data(lines):  # 在這里lines = f.readlines()
    '''
    :param lines: 輸入的是字串形式,這樣更為方便轉化
    :return: 字串對應的串列list形式
    '''
    sizeArry = []  # 創建一個list,用來存盤資料
    for line in lines:
        line = line.replace("\n", "")
        # 因為讀出來的資料每一行都有一個回車符,我們要洗掉
        line = float(line)
        # 將其轉換為整數
        sizeArry.append(line)
    # 轉換為numpy 可以識別的陣列
    return np.asarray(sizeArry)

def get_file_data(path):
    '''
    :param path: 需要讀取的圖片所在路徑
    :return: 得到字串形式的陣列
    '''
    # 首先打開檔案從檔案中讀取資料
    f = open(path)  # path存盤的是我們的目標檔案所在的位置
    # 我們先打開目標檔案然后讀取出這個檔案中的每一行
    lines = f.readlines()
    return get_strlist_data(lines)

#影像資訊矩陣化(灰度圖片)
def ImagetoArray(filename):
    im = Image.open(filename)
    #im.show()
    # 圖片資訊矩陣化
    data = np.asarray(im)
    data = np.array(data, dtype='float')
    return data
#三色道分離操作
def ImagetoArrayRGB(filename,channel):
    data=ImagetoArray(filename)
    if channel=='r':
        return data[:,:,0]
    if channel=='g':
        return data[:,:,1]
    if channel=='b':
        return data[:,:,2]

def Entropy(Mat):
    M=np.size(Mat)#資料總量
    Census=np.zeros(255)
    for i in range(np.shape(Mat)[0]):
        for j in range(np.shape(Mat)[1]):
            Census[int(Mat[i][j])-1]+=1
    sum=0
    for i in Census:
        if i == 0:
            continue
        else:
            sum+=i*math.log(i)
    entropy=-sum/M+math.log(M)
    return entropy

if __name__=="__main__":
    Path='菲謝爾1.jpg'
    R=ImagetoArrayRGB(Path,'r')
    G=ImagetoArrayRGB(Path,'g')
    B=ImagetoArrayRGB(Path, 'b')
    print(Entropy(R)+Entropy(G)+Entropy(B))

在這里插入圖片描述
上圖中的菲謝爾的資訊量為:

15.555038790999852

2.一個發射器發出A,B,C三個訊息

一個發射器發出A,B,C三個訊息,他們的先驗概率和條件概率分別為:

iABC
P(i)9/2716/272/27

條件概率為:

P(i/j)ABC
A04/51/5
B1/21/20
C1/22/51/10

Q1:求信源熵,
Q2:求信源最大熵,
Q3:求剩余度,

'''
2.一個發射器發出A,B,C三個訊息,他們的先驗概率和條件概率分別為:
  i     A     B     C
P(i)  9/27  16/27  2/27

 0   4/5  1/5
1/2  1/2   0
1/2  2/5  1/10
'''
import math
def SourceEntropy(a,A):
    '''
    用于計算信源熵值(條件熵)
    :param a: 信源的先驗概率向量
    :param A:條件概率
    :return: 信源熵
    '''
    sum=0
    l=len(a)#a的元素個數,對應A的行數
    for i in range(l):
        for j in A[i]:
            if j==0:
                continue
            else:
                sum+=a[i]*j*math.log(j)
    return -sum

if __name__=="__main__":
        a=[9/27,16/27,2/27]
        A=[[0,4/5,1/5],[1/2,1/2,0],[1/2,2/5,1/10]]
        print('第一問答案:信源熵為'+str(SourceEntropy(a,A)))
        B=[[1/3,1/3,1/3],[1/3,1/3,1/3],[1/3,1/3,1/3]]
        print('第二問答案:信源最大熵為' + str(SourceEntropy(a, B)))
        print('第三問答案:剩余度為'+str(1-SourceEntropy(a,A)/SourceEntropy(a, B)))

結果展示:

第一問答案:信源熵為0.6474323513133665
第二問答案:信源最大熵為1.0986122886681093
第三問答案:剩余度為0.4106816772473262

3.互資訊量和平均互資訊量的求解

在這里插入圖片描述

#Q3 互資訊量和平均互資訊量的求解
import math
import numpy as np

def  MutualInformation(Px,Py,Pxy):
    return Pxy*math.log2(Pxy/(Px*Py))

def AveMutualInformation(PM):
    PM=PM/sum(sum(PM))
    Px=[sum(PM[i][:]) for i in range(np.shape(PM)[0])]
    Py=[sum(PM[:][i]) for i in range(np.shape(PM)[1])]
    s=0
    for i in range(len(Px)):
        for j in range(len(Py)):
            if Px[i]==0 or Py[j]==0 or PM[i][j]==0:
                continue
            else:
                s+=MutualInformation(Px[i],Py[j],PM[i][j])
    return s

if __name__=='__main__':
    ProM=np.array([[1/2,1/2],[1/2,1/2]])
    print('矩陣對應的互資訊量為'+str(AveMutualInformation(ProM)))
    print(MutualInformation(1/2,1/2,1))

結果展示:

矩陣對應的互資訊量為0.0
2.0

在這里插入圖片描述


4.聯合熵的求解

已知信源X和信源Y的聯合概率,求解X和Y的聯合熵,

#Q4 已知信源X和信源Y的聯合概率,求解X和Y的聯合熵,
import numpy as np
import math

def JointEntropy(PM):
    #先進行歸一化
    PM=PM/sum(sum(PM))
    s=0
    for i in PM:
        for j in i:
            s+=j*math.log2(j)
    return -s
if __name__=='__main__':
    PM=np.array([[1/2,1/2],[1/2,1/2]])
    print('上述概率矩陣對應的聯合熵為:'+str(JointEntropy(PM)))

結果展示為:

上述概率矩陣對應的聯合熵為:2.0

5.Kraft不等式的分析與判斷

給定信源符號個數,碼元進制數和碼長,判斷唯一可譯碼是否存在,

'''
5.Kraft不等式的分析與判斷
給定信源符號個數,碼元進制數和碼長,判斷唯一可譯碼是否存在
'''
if __name__=="__main__":
    NumOfSource=int(input('信源符號個數:'))
    Hex=int(input('碼元進制數:'))
    Length=int(input('碼長:'))
    if Hex**Length==NumOfSource:
        print('存在唯一可譯碼,')
    else:
        print('不存在唯一可譯碼,')

結果展示:

信源符號個數:8
碼元進制數:2
碼長:3
存在唯一可譯碼,

信源符號個數:9
碼元進制數:2
碼長:4
不存在唯一可譯碼,

6.費諾編碼的分析與實作

給定信源各個符號及其發生概率,求解其費諾編碼的碼字,平均碼長和編碼效率,

'''
6.費諾編碼的分析與實作
給定信源各個符號及其發生概率,求解其費諾編碼的碼字,平均碼長和編碼效率
'''
import numpy as np
import math
import re

def Partition(lxh,N):
    Norm_lxh=lxh/sum(lxh)
    for i in range(len(lxh)):
        if sum(Norm_lxh[:i+1])>=1/2:
            if abs(sum(Norm_lxh[:i+1])-1/2)>=abs(sum(Norm_lxh[:i])-1/2):
                return [[lxh[:i],lxh[i:]],[N[:i],N[i:]]]
            else:
                return [[lxh[:i+1],lxh[i+1:]],[N[:i+1],N[i+1:]]]

def Tree(lxh,N,filename):
    if lxh.size==1:
        print(N)
        print(N,file=filename)
    else:
        print(Partition(lxh, N)[1])
        print(Partition(lxh,N)[1],file=filename)
        for i in range(len(Partition(lxh,N)[0])):
            Tree(Partition(lxh,N)[0][i],Partition(lxh,N)[1][i],filename)

def AveLen(P,L):
    sum=0
    for i in range(len(P)):
        sum+=P[i]*L[i]
    return sum

def CodeEfficiency(H,L):
    return H/L

def Entrify(P):
    sum=0
    for i in range(len(P)):
        if P[i]!=0:
            sum+=P[i]*math.log2(P[i])
    return -sum

def BiCode(n,k):
    #n為長度,k為序號
    if k<=2**n:
        infor=str(bin(k))
        infor=infor[2:]
        infor=int((n-len(infor)))*'0'+infor
        return infor
    else:
        raise('編碼錯誤,碼樹無法生成!')
def FenoCode(Num):
    Code=[]
    for i in Num:
        for k in range(0,int(2**i)):
            for j in Code:
                if re.match(BiCode(i,k),j) or re.match(j,BiCode(i,k)):
                    break
            else:
                Code.append(BiCode(i,k))
                break
    return Code


if __name__=='__main__':
    file='recode.log'

    mylog = open(file, mode='w', encoding='utf-8')

    N=['A','B','C','D','E','F','G']
    A=np.array([1/3,1/4,1/12,1/12,1/12,1/12,1/12])

    Num=np.zeros(len(N))
    Tree(A,N,mylog)

    mylog.close()

    with open(file,'r') as f:
        Infor=f.read()
    for i in range(len(Num)):
        Num[i]+=Infor.count(N[i])-1
    print('-'*30)
    print('碼字為:')
    Cod=FenoCode(Num)
    print(Cod)

    for i in range(len(A)):
        print(N[i]+' '+str(round(A[i],3))+' '+Cod[i])
    print('平均碼長為:'+str(round(AveLen(A,Num),3)))
    print('編碼效率為:'+str(round(Entrify(A)/AveLen(A,Num),3)))

結果展示:

[['A', 'B'], ['C', 'D', 'E', 'F', 'G']]
[['A'], ['B']]
['A']
['B']
[['C', 'D'], ['E', 'F', 'G']]
[['C'], ['D']]
['C']
['D']
[['E', 'F'], ['G']]
[['E'], ['F']]
['E']
['F']
['G']
------------------------------
碼字為:
['00', '01', '100', '101', '1100', '1101', '111']
A 0.333 00
B 0.25 01
C 0.083 100
D 0.083 101
E 0.083 1100
F 0.083 1101
G 0.083 111
平均碼長為:2.583
編碼效率為:0.976

7.二進制哈夫曼編碼的分析與實作

給定信源各個符號及其發生概率,求解其二進制哈夫曼編碼碼字,平均碼長,及其編碼效率,

'''
 7.二進制哈夫曼編碼的分析與實作
給定信源各個符號及其發生概率,求解其二進制哈夫曼編碼碼字,平均碼長,及其編碼效率,
'''
import numpy as np
import math
import re

def Join(P,N,filename):
    if len(N)==1:
        return None
    else:
        P=P/sum(P) #歸一化
        P, N = (list(t) for t in zip(*sorted(zip(P, N))))
        print(N[0], N[1], sep=' ')
        print(N[0],N[1],sep=' ',file=filename)
        P=[P[0]+P[1]]+P[2:]
        #print(P)
        N=[N[0]+' '+N[1]]+N[2:]
        #print(N)
        Join(P,N,filename)
        return None

def AveLen(P,L):
    s=0
    for i in range(len(P)):
        s+=P[i]*L[i]
    return s

def CodeEfficiency(H,L):
    return H/L

def Entrify(P):
    sum=0
    for i in range(len(P)):
        if P[i]!=0:
            sum+=P[i]*math.log2(P[i])
    return -sum

def BiCode(n,k):
    #n為長度,k為序號
    if k<=2**n:
        infor=str(bin(k))
        infor=infor[2:]
        infor=int((n-len(infor)))*'0'+infor
        return infor
    else:
        raise('編碼錯誤,碼樹無法生成!')

def FenoCode(Num):
    Code=[]
    for i in Num:
        for k in range(0,int(2**i)):
            for j in Code:
                if re.match(BiCode(i,k),j) or re.match(j,BiCode(i,k)):
                    break
            else:
                Code.append(BiCode(i,k))
                break
    return Code

if __name__=='__main__':
    mylog = open('recode7.log', mode='w', encoding='utf-8')

    P=np.array([0.4,0.2,0.2,0.1,0.1])
    M=['a','b','c','d','e']
    Join(P,M,mylog)

    mylog.close()
    Num=np.zeros(len(P))
    with open('recode7.log','r') as f:
        Infor=f.read()
    for i in range(len(Num)):
        Num[i]+=Infor.count(M[i])
    print('-'*30)
    print(Num)

    print('碼字為:')
    Cod = FenoCode(Num)
    print(Cod)

    for i in range(len(P)):
        print(M[i] + ' ' + str(round(P[i], 3)) + ' ' + Cod[i])
    print('平均碼長為:' + str(round(AveLen(P, Num), 3)))
    print('編碼效率為:' + str(round(Entrify(P) / AveLen(P, Num), 3)))

結果展示為:

d e
b c
d e a
b c d e a
------------------------------
[2. 2. 2. 3. 3.]
碼字為:
['00', '01', '10', '110', '111']
a 0.4 00
b 0.2 01
c 0.2 10
d 0.1 110
e 0.1 111
平均碼長為:2.2
編碼效率為:0.965

文稿:錦帆遠航
代碼:錦帆遠航
圖片:百度圖片


你的支持(三連)是航航堅持下去的不懈動力哦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272162.html

標籤:AI

上一篇:植物大戰僵尸 修改存檔和金錢

下一篇:Python-基于OpenCV的輪廓填充 泛洪演算法 孔洞填充

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more