নাইভ বেয়েসে লগ-সম-এক্সপ্রেস কৌশল কীভাবে কাজ করে তার উদাহরণ


14

আমি অনেক জায়গায় লগ-সাম-এক্সপ্রেস ট্রিক সম্পর্কে পড়েছি (উদাহরণস্বরূপ এখানে এবং এখানে ) তবে নায়েভ বেয়েস শ্রেণিবদ্ধের জন্য এটি কীভাবে বিশেষভাবে প্রয়োগ করা হয় তার উদাহরণ কখনও দেখেনি (যেমন বিচ্ছিন্ন বৈশিষ্ট্য এবং দুটি শ্রেণি সহ)

কীভাবে কেউ এই কৌশলটি ব্যবহার করে সংখ্যার আন্ডারফ্লোর সমস্যাটি এড়াতে পারবেন?


2
এখানে নিখরচায় বেয়েসের জন্য পরিষ্কারভাবে প্রয়োজন না হলেও এর ব্যবহারের বেশ কয়েকটি উদাহরণ রয়েছে । তবে, এটি খুব কমই গুরুত্বপূর্ণ, যেহেতু কৌতুকের ধারণাটি বেশ সোজা এবং সহজেই অভিযোজ্য।
গ্লেন_বি -রিনস্টেট মনিকা

সমস্যা ওভারফ্লোয়ের চেয়ে ডুবে যাওয়ার সম্ভাবনা বেশি।
হেনরি

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আন্ডারফ্লোতে কোনও অনুসন্ধান করার চেষ্টা করুন এবং তারপরে আপনার প্রশ্নটি ইতিমধ্যে যা আচ্ছাদন করা হয়নি তার আরও সুনির্দিষ্টভাবে ঠিকানার জন্য আপডেট করুন।
গ্লেন_বি

আপনি কি স্পষ্ট করে বলতে পারেন - এটি বার্নোল্লি-মডেল নিখুঁত বায়েস? অন্য কিছু সম্ভবত?
গ্লেন_বি -রিনস্টেট মনিকা

নীচে নীচের অংশে এখানে উদাহরণটি দেখুন ('এছাড়াও আরও দেখুন' এর আগে যেখানে তারা লগগুলি নিয়েছেন; উভয় পক্ষকে ঘনিষ্ট করে কিন্তু আরএইচএসকে "যেমন রয়েছে" (লগের যোগফলের সমাপ্তিরূপে) রেখে যাওয়া লগের উদাহরণ হতে পারে -সুম-এক্সপ্রেস ট্রিক। এটি কি আপনাকে নায়েভ বেয়েসে এর ব্যবহার সম্পর্কিত আরও নির্দিষ্ট সুনির্দিষ্ট প্রশ্ন জিজ্ঞাসা করার জন্য যথেষ্ট তথ্য দেয়?
গ্লেন_বি -রেইনস্টেট মনিকা

উত্তর:


26

ইন

p(Y=C|x)=p(x|Y=C)p(Y=C) k=1|C|p(x|Y=Ck)p(Y=Ck)

ডিনোমিনেটর এবং উভয়ই খুব ছোট হয়ে যেতে পারে, সাধারণত 0 এর কাছাকাছি হতে পারে এবং আমরা তাদের অনেককে একে অপরের সাথে গুণ করি। আন্ডারফ্লো প্রতিরোধ করতে, কেউ কেবলমাত্র সংখ্যার লগ নিতে পারে, তবে একটিকে ডিনোমিনেটরের জন্য লগ-সম-এক্সপ্রেস ট্রিক ব্যবহার করা উচিত।p(xi|Ck)


আরও সুনির্দিষ্টভাবে বলা যায়, পাতাল প্রতিরোধের জন্য:

  • যদি আমরা কেবলমাত্র কোন শ্রেণি ইনপুট সম্ভবত সর্বাধিক পোস্টেরিয়েরি (এমএপি) সিদ্ধান্তের নিয়মের সাথে সম্পর্কিত তা জানার চিন্তা করি তবে আমরা তা করি না লগ-সম-এক্সপ্রেস ট্রিকটি প্রয়োগ করতে হবে, যেহেতু আমাদের ক্ষেত্রে ডিনোমিনেটর গণনা করতে হবে না । অঙ্কের জন্য আন্ডারফ্লো প্রতিরোধ করতে লগটি সহজেই নেওয়া যায়: । আরো নির্দিষ্টভাবে:( এক্স = এক্স 1 , ... , x এর এন ) ( পি ( এক্স | ওয়াই = সি ) পি ( ওয়াই = সি ) )(y^)(x=x1,,xn)log(p(x|Y=C)p(Y=C))

    y^=argmaxk{1,,|C|}p(Ck|x1,,xn)=argmaxk{1,,|C|} p(Ck)i=1np(xi|Ck)

    যা লগ নেওয়ার পরে হয়ে যায়:

y^=argmaxk{1,,|C|}log(p(Ck|x1,,xn))=argmaxk{1,,|C|}log( p(Ck)i=1np(xi|Ck))=argmaxk{1,,|C|}(log(p(Ck))+ i=1nlog(p(xi|Ck)))
  • আমরা ক্লাসের সম্ভাবনা গণনা করতে চাইলে আমাদের ডিনোমিনেটর গণনা করতে হবে:p(Y=C|x)

    log(p(Y=C|x))=log(p(x|Y=C)p(Y=C) k=1|C|p(x|Y=Ck)p(Y=Ck))=log(p(x|Y=C)p(Y=C)numerator)log( k=1|C|p(x|Y=Ck)p(Y=Ck)denominator)

    উপাদান কারণ underflow পারে খুব ছোট হতে পারে: এটি সংখ্যার মতো একই সমস্যা, তবে অভ্যন্তরে আমাদের একটি সংমিশ্রণ রয়েছে, যা আমাদের রূপান্তর করতে বাধা দেয় (কাছাকাছি হতে পারে 0) এ ( ) থেকে নেতিবাচক এবং 0 )। এই সমস্যাটি রোধ করার জন্য, আমরা করতে পারি:log( k=1|C|p(x|Y=Ck)p(Y=Ck))p(xi|Ck)p(xi|Ck)log(p(xi|Ck))0p(xi|Ck)1p(xi|Ck)=exp(log(p(xi|Ck)))

    log( k=1|C|p(x|Y=Ck)p(Y=Ck))=log( k=1|C|exp(log(p(x|Y=Ck)p(Y=Ck))))

    এই মুহুর্তে, একটি নতুন সমস্যা দেখা দেয়: বেশ নেতিবাচক হতে পারে, যা বোঝায় 0 এর খুব কাছাকাছি হতে পারে, অর্থাৎ আন্ডারফ্লো। আমরা এখানে লগ-সম-এক্সপ্রেস ট্রিকটি ব্যবহার করি :log(p(x|Y=Ck)p(Y=Ck))exp(log(p(x|Y=Ck)p(Y=Ck)))

    logkeak=logkeakeAA=A+logkeakA

    সঙ্গে:

    • ak=log(p(x|Y=Ck)p(Y=Ck)) ,
    • A=maxk{1,,|C|}ak.

    আমরা দেখতে পারি যে পরিবর্তনশীল প্রবর্তনের underflows এড়াতে। উদাহরণস্বরূপ আমাদের রয়েছে:Ak=2,a1=245,a2=255

    • exp(a1)=exp(245)=3.96143×10107
    • exp(a2)=exp(255)=1.798486×10111

    লগ-সাম-এক্সপ্রেট ট্রিকটি ব্যবহার করে আমরা : A=max(245,255)=245logkeak=logkeakeAA=A+logkeakA=245+logkeak+245=245+log(e245+245+e255+245)=245+log(e0+e10)

    আমরা যেহেতু underflow এড়ানো অনেক অধিকতর থেকে 0 থেকে দূরে বা ।e103.96143×101071.798486×10111


2

মনে করুন আমরা দুটি ডাটাবেসের মধ্যে কোনটি একটি বাক্যাংশ তৈরির সম্ভাবনা বেশি চিহ্নিত করতে চাই (উদাহরণস্বরূপ, কোন উপন্যাসটি এই শব্দগুচ্ছ থেকে এসেছে সম্ভবত)। আমরা ডাটাবেসে শর্তসাপেক্ষ শব্দের স্বতন্ত্রতা নিতে পারি (নেভ বেইস অনুমান)।

এখন আপনি পোস্ট করেছেন দ্বিতীয় লিঙ্কটি দেখুন। সেখানে ডাটাবেস প্রদত্ত বাক্যটি পর্যবেক্ষণের যৌথ সম্ভাবনার প্রতিনিধিত্ব করবে এবং s বাক্যটির প্রতিটি শব্দ পর্যবেক্ষণের সম্ভাব্যতা উপস্থাপন করবে।aebt


1

আমরা এই উত্তরটি থেকে দেখতে পাচ্ছি যে পাইথনের ক্ষুদ্রতম সংখ্যাটি (উদাহরণস্বরূপ এটি গ্রহণ করুন) আইইইই 7575৫ এর5e-324 কারণে , এবং হার্ডওয়্যার কারণ অন্যান্য ভাষার ক্ষেত্রেও প্রযোজ্য।

In [2]: np.nextafter(0, 1)
Out[2]: 5e-324

এবং এর চেয়ে ছোট কোনও ভাসমান 0 বাড়ে।

In [3]: np.nextafter(0, 1)/2
Out[3]: 0.0

এবং আসুন with discrete features and two classesআপনার প্রয়োজন অনুসারে নাইভ বেয়েসের কাজটি দেখুন :

p(S=1|w1,...wn)=p(S=1)i=1np(wi|S=1) s={0,1}p(S=s)i=1np(wi|S=s)

আমাকে একটি সাধারণ এনএলপি টাস্ক বেলো দ্বারা সেই ফাংশনটি ইনস্ট্যান্ট করতে দিন।

আমরা আগত ইমেলটি স্প্যাম ( ) না স্প্যাম ( ) কিনা তা সনাক্ত করার সিদ্ধান্ত নিয়েছি এবং আমাদের কাছে 5000 শব্দ আকারের শব্দভাণ্ডার রয়েছে ( ) এবং কেবলমাত্র উদ্বেগটি যদি কোনও শব্দ ( ) হয় তবে ( ) সরলতার জন্য ইমেলটিতে বা ( ) নয় বায়েস )।S=1S=0n=5,000wip(wi|S=1)1p(wi|S=1)

In [1]: import numpy as np
In [2]: from sklearn.naive_bayes import BernoulliNB
# let's train our model with 200 samples
In [3]: X = np.random.randint(2, size=(200, 5000))
In [4]: y = np.random.randint(2, size=(200, 1)).ravel()
In [5]: clf = BernoulliNB()
In [6]: model = clf.fit(X, y)

আমরা দেখতে পাচ্ছি যে সম্ভাবনার কারণে খুব ছোট হবে (উভয় এবং 0 এবং 1 এর মধ্যে in এর মধ্যে হবে , এবং তাই আমরা নিশ্চিত যে পণ্যটি than এর চেয়ে ছোট হবে এবং আমরা কেবল পাব ।p(S=s)i=1np(wi|S=s)p(wi|S=1)1p(wi|S=1)i50005e3240/0

In [7]: (np.nextafter(0, 1)*2) / (np.nextafter(0, 1)*2)
Out[7]: 1.0

In [8]: (np.nextafter(0, 1)/2) / (np.nextafter(0, 1)/2)
/home/lerner/anaconda3/bin/ipython3:1: RuntimeWarning: invalid value encountered in double_scalars
  #!/home/lerner/anaconda3/bin/python
Out[8]: nan
In [9]: l_cpt = model.feature_log_prob_
In [10]: x = np.random.randint(2, size=(1, 5000))
In [11]: cls_lp = model.class_log_prior_
In [12]: probs = np.where(x, np.exp(l_cpt[1]), 1-np.exp(l_cpt[1]))
In [13]: np.exp(cls_lp[1]) * np.prod(probs)
Out[14]: 0.0

তারপরে সমস্যা দেখা দেয়: ইমেলের সম্ভাব্যতা আমরা কীভাবে স্প্যাম গণনা করতে পারি ? বা কীভাবে আমরা অঙ্ক এবং ডিনোমিনেটর গণনা করতে পারি?p(S=1|w1,...wn)

আমরা স্কলারনে অফিসিয়াল বাস্তবায়ন দেখতে পাচ্ছি :

jll = self._joint_log_likelihood(X)
# normalize by P(x) = P(f_1, ..., f_n)
log_prob_x = logsumexp(jll, axis=1)
return jll - np.atleast_2d(log_prob_x).T

সংখ্যার জন্য এটি সম্ভাবনার পণ্যগুলিকে লগ সম্ভাবনার যোগফলে রূপান্তর করে এবং ডিনোমিনেটরের জন্য এটি স্কিপিতে লগসুমপ এক্সপেক্ট ব্যবহার করে যা:

out = log(sum(exp(a - a_max), axis=0))
out += a_max

কারণ আমরা এর যৌথ লগ সম্ভাবনা যুক্ত করে দুটি যৌথ সম্ভাবনা যুক্ত করতে পারি না এবং আমাদের লগ স্পেস থেকে সম্ভাব্যতার জায়গায় যেতে হবে। তবে আমরা দুটি সত্য সম্ভাব্যতা যুক্ত করতে পারি না কারণ সেগুলি খুব ছোট এবং আমাদের এগুলি স্কেল করা উচিত এবং সংযোজন করা উচিত: এবং ফলাফলটি ফিরে দেওয়া লগ স্পেসে তারপরে এটি পুনরুদ্ধার করুন: লগ স্থান যোগ করে ।s={0,1}ejllsmax_jlllogs={0,1}ejllsmax_jllmax_jll+logs={0,1}ejllsmax_jllmax_jll

এবং এখানে উদ্ভূত:

logs={0,1}ejlls=logs={0,1}ejllsemax_jllmax_jll=logemax_jll+logs={0,1}ejllsmax_jll=max_jll+logs={0,1}ejllsmax_jll

যেখানে হয় কোডে।max_jlla_max

একবার আমরা লগ স্পেসে এবং ডিনোমিনেটর উভয়ই পেয়ে গেলে আমরা সংখ্যার থেকে ডিনোমিনিটারকে বিয়োগ করে লগের শর্তসাপেক্ষ সম্ভাবনা ( ) পেতে পারি : logp(S=1|w1,...wn)

return jll - np.atleast_2d(log_prob_x).T

আশা করি এইটি কাজ করবে.

তথ্যসূত্র:
1. বার্নোল্লি নাইভ বেইস ক্লাসিফায়ার
2. নাইভ বেয়েসের সাথে স্প্যাম ফিল্টারিং - কোন নাইভ বেয়েস?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.