Professional Documents
Culture Documents
الهدف من الجلسة:
توليد سالسل نصية بتوزع احتمالي محدد
ترميز المصدر المحرفي األمثلي :متوسط طول الترميز يحقق المتراجحةH(X) <= Lc< H(X) +1 :
حساب متوسط طول ترميز محرفي
ترميز المصدر المحرفي األمثلي هو ترميز هوفمان
1التمرين األول :توليد سلسلة نصية بحسب شعاع توزع احتمال من أبجدية محددة
اكتب تابع chardataيولد سلسلة عشوائية من المحارف.
سنكتب نسخة عامة بحيث يأخذ التابع chardataكدخل:
مجموعة المحارف (أبجدية) alphabetالتي نريد تشكيل نص منها
التوزع االحتمالي pالتي نريد أن نولد المحارف بحسبها
طول سلسلة الخرج nالمراد توليدها عشوائيا ً
ويعيد كخرج :شXXعاع محXXارف (نص )textطولXXه nمكXXون من المحXXارف الموجXXودة في alphabetبحيث نسXXبة
تكرار (ورود) كل حرف فيه يخضع للنسب المدخلة في شعاع التوزيع االحتمالي للمحارف
الحظ أن شعاع األبجدية alphabetوشعاع التوزع االحتمالي pيجب أن يكونوا من نفس الطول
)function text=chardata(alphabet,p,n
%alphabet is the sample space
%p is the probability distribution vector
%n number of sample to be generated
%text is a vector of character from the alphabet with the probability p
;)N=length(alphabet
)if N~=length(p
)'error('p and alphabet are not of the same length
end
1
;)x=rand(1,n
for i=1:n
for j=1:N
if x(i)<cumulative_p(j) % checking in which sub-interval x(i) lies
;)text(i)=alphabet(j
break
;end
end
end
االستدعاء:
]>>ps=[1/2 1/4 1/8 1/8
]'>>alphabet=['a','b','c','d
;)>>texts=chardata(alphabet,ps,1000
كيف نتأكد أن نسبة ورود المحارف في السلسلة المشكلة هي بحسب االحتماالت التي تم إدخالها في شعاع
التوزيع؟
نعد عدد مرات ورود كل حرف
))’>>length(find(texts =’a
))’>>length(find(texts =’b
فسر األرقام التي تحصل عليها ،لماذا ال نستطيع رسم الهيستوغرام؟
ألن تابع الرسم barال يأخذ شعاع محارف كقيم للمحور x
الحل أن نرسم عدد مرات ورود كل حرف بداللة ترتيب الحرف في األبجدية
كيف نحصل على ترتيب الحرف؟ بأخذ asciiكXXود للحXXرف (بتحويXXل الحXXرف إلى نمXXط )uint8وطXXرح
asciiكود ألول حرف الذي هو aوإضافة ( 1من أجل أتن يكون ترتيبت الحرف aهو , 1وليس (0
أضف الكود التالي إلى تابع myhist
if ischar(samples) % is the samples are of class char: characters
si=uint8(samples)-uint8('a');% si is the index of each character sample
else
;si=samples
end
bar(si,f) % plot f as a function of 600
samples as bars
استدعي التابع myhist 500
;)>>[s,f]=myhist(texts 400
300
200
2 100
0
0.5 1 1.5 2 2.5 3 3.5 4 4.5
التمرين الثاني :ترميز مصدر رباعي 2
نريد توليد سلسلة من 1000حرف (مشكلة من األحرف [' ]'a','b','c','dوبنسب ورود يحددها المستخدم عبر
تمرير شعاع التوزيع االحتمالي للمحارف) ومن ثم نريد ترميز هذه السلسة بحسب الترميز:
رمزه المحرف
0 a
10 b
110 c
111 d
اكتب تابع encoderيأخذ كدخل سلسلة من المحارف وترمXيز cومجموعXة المحXارف الXتي يتشXكل منهXا
النص ويعيد السلسلة بعد ترميزها
لنكتب تابع يقوم بترميز سلسلة نصية بحسب الترميز cيمرره المستخدم
الحظ أن بنية المعطيات لتمثيل الترميز (العمود الثاني في جدول الترميز) هو شعاع عناصره أشعة ،في الماتالب
تسمى هذه البنية بـ ،cell arrayفمثالً لتمثيل الترميز في الجدول السابق:
}]>>c2={0,[1 0],[1 1 0], [1 1 1
ويكون } c{1هو رمز أول نحرف:
}>>c2{1
لمعرفة من هو أول محرف يجب تعريف مجموعة المحارف alphabet
]'>>alphabet=['a','b','c','d
الحظ أننا نستطيع أن ندمج شعاع alphabetو الترميز cفي cell arrayواحد
;>> c2={'a',0
;]'b',[1 0
;]'c',[1 1 0
}]'d',[1 1 1
وفي هذه الحالة يكفي تمرير هذه الترميز بدون مجموعة األبجدية (طبعا ً يجب تعديل التابع التالي بحيث يأخذ البنية
الجديد للترميز المكون من عمودين ،عمود للمحارف وعمود لقيم ترميز المحارف
لنكتب اآلن التابع encoderالذي يقوم بترميز سلسلة نصية textبحسب ترميز (يسمى أيضا ً قاموس)
مثالً إذا كان لدينا الترميز c2السابق و السلسلة التالية:
’text=’dacab
فإن هذ التابع سوف يعيد السلسلة المرمزة لهذا النص (باستبدال كل حرف بترميزه)
1110110010
الحظ أن السلسلة التالية هي عبارة عن شعاع من البتات
3
function enco=encoder(text,alphabet,c)
%text: is the text to be encoded
%alphabet: sample space
%c: code cell array
enco=[];
%enco={};
for i=1:length(text)
j=find(text(i)==alphabet);% the order of the current character in the alphabet
enco=[enco c{j}];%take the code of this character and add it to the enco vector
%enco{i}=c{j};
end
إذا استخدمنا البنية الثانية للترميز حيث يحوي الترميز األبجدية في العمود األول وقيم الترميز في العمود الثاني
:يكون التابع كالتالي
function enco=encoder(text, c)
%text: is the text to be encoded
%c: code cell array:
% column 1 is the alphabet
% column 2 is the code of the alphabet
%enco is the output encoded vector: vector of bits
enco=[];
[N,M]=size(c);% N is the number of samples in the alphabet, M is 2
for i=1:length(text) % take every character in the text and find it's code
for j=1:N% searching loop
if text(i)==c{j,1}% if the current character of the text is the sample in the j row
enco=[enco c{j,2}];%take the code of this character from the second
column of the same row and add it to the previous encoded vector
break
end
end
end
>>enco1s=encoder(texts,c1)
4
مقارنة بين شجرة البحث 1وشجرة البحث :2 3
الحظ أن الشجرة ( )1هي عبارة عن ترميز هوفمان عندما يكون التوزع االحتمالي للمصدر توزع منتظم
الحظ أن الشجرة ( )2هي عبارة عن ترميز هوفمان عندما يكون التوزع االحتمالي للمصدر هو [
( ]1/2,1/4,1/8,1/8هذه حالة خاصة ليست دوما ً شجرة البحث الثنائي الموزنة (والتي هي ترميز شانون فانو)
هي شجرة هوفمان)
5
رمزه المحرف رمزه المحرف
00 a 0 a
01 b 10 b
10 c 110 c
11 d 111 d
الترميز2 X الترميز1 X
سوف نرمز النص المنتظم مرتين ،األولى باستخدام الترميز ، 1cوالثانية بالترميز c2 .2
ونحسب المتوسط (اإلحصائي) لعدد البتات للحرف الواحد في كل سلسلة من السلستين المرمزتين (المتوسط
هو طول السلسلة بالبتات تقسيم عدد األحرف التي ترمزها السلسلة الذي في حالتنا هو 1000حرف)
الترميز الذي يعطي أقل متوسط هو األفضل
)enco1u=encoder(textu, c1
)enco2u=encoder(textu, c2
6
سوف نرمز النص ذو التوزع Psغير المنتظم مرتين ،األولى باستخدام الترميز ، 1cوالثانية بالترميز c2 .3
ونحسب المتوسطين
)enco1s=encoder(texts, c1
)enco2s=encoder(texts, c2
)Lc1u=sum(L1.*Pu
)Lc1s=sum(L1.*Ps
)Lc2u=sum(L2.*Pu
)Lc2s=sum(L2.*Ps
7
خالصة:
.1في حالة الت وزع المنتظم : Puالترم يز c1ق د أعطى أداء أفض ل (من أج ل الت وزع المنتظم متوس ط عم ق
الشجرة 1هو 2بت أقل من متوسط عمق الشجرة 2الذي هو 2.25بت).
.2في حالة الت وزع غ ير المنتظم : Psالش جرة 2ك ان أداءه ا أفض ل حيث أن متوس ط عمقه ا ك ان 1.75بت
مقابل 2بت للشجرة .1
.3مع تغير التوزع االحتمالي يتغير األنتروبي للمص در ،وبالت الي ش جرة الترم يز األمثلي (هوفم ان) ومتوس ط
طول الترميز األمثلي يتغير ،حيث يجب أن ال يتجاوز اإلنتروبي.
.4من أجل التوزع االحتمالي المنتظم يكون اإلنتروبي أعظمي ،وأي ش جرة ترم يز لن تعطي أداء أفض ل (ط ول
ترميز أقصر) من شجرة بحث ثنائية غير موزنة (الشجرة )1حيث أن عمقها يس اوي إلى أن تروبي المص در
) ،log(Nوبالتالي ال يمكن ضغط المصدر.
.5عندما تكون احتماالت المحارف تكتب بقوى 2السالبة عندها يكون متوسط طول الترميز األمثلي (هوفم ان)
يساوي اإلنتروبي (برهن على ذلك رياضيا ،م ا هي العالق ة بين ط ول الرم ز واحتمال ه في ه ذه الحال ة؟) ،
ويكون ترميز هوفمان هو نفسه ترميز فانو وهو نفسه شجرة بحث ثنائية موزنة.
.6لذلك نرى أن الفرق بين إنتروبي المصدر واإلنتروبي األعظمي (عندما نخزن 4محارف ال نعرف احتماالتها
نفترض أسوء حالة وهي أن توزعها منتظم فنرمزها بحسب الشجرة ،فإذا كان توزعه ا غ ير منتظم ا ً نك ون
هنالك حشو "فائض") ،يدل على إمكانية ضغط المص در ،ويس مى ه ذا الف رق بالـ "حش و" (أو الف ائض)
،redundancyفالمصادر التي قيمة redundancyلها 0ال يمكن ضغطها (لماذا؟)
.7إذا ك ان ل دينا أبجدي ة من Nمح رف وال نع رف توزعه ا االحتم الي نرم ز ك ل ح رف على ) log2(Nبت
ونفترض أسوء حالة (من ناحية طول الترم يز ال ذي نحتاج ه) وهي أن الت وزع منتظم ونك ون ب ذلك أعطين ا
طول متساوي لجميع المحارف ،فإذا كان توزعها الفعلي بعيداً عن التوزع المنتظم (ماذا يعني بعيد؟ أي قيمة
عالية لـ ) )D(p||qيكون لدينا حشو كبير ،وبالتالي يمكن إعادة ترميزه ا (الض غط ه و عملي ة تغ ير ترم يز
المحارف من ش كل إلى أخ ر فمثالً نحن نغ ير ترم يز الح رف ‘ ’aمن asciiإلى ترم يز بحس ب )c1بحس ب
ترميز هوفم ان األمثلي ال ذي يعتم د على أن نعطي المح ارف األعلى احتم االً (األك ثر وروداً) كلم ات ترم يز
قصيرة أما المحارف األقل احتماالً فنعطيها كلمات ترميز طويلة (أي نعطي كل كحرف عدد من البتات بحس ب
كمية معلومات شانون له (ما هي؟)).
8
احسب اإلنتروبي للتوزعين ،و قارن مع طول الشجرة األمثلية في كل حالة .8
Hu=-sum(Pu.*log2(Pu))% entropy of the source when the probability vector is
)uniform=max Entropy=log2(N
Hs=-sum(Ps.*log2(Ps))% entropy of the source when the probability vector non
uniform PS
9