ওভারফ্লো ত্রুটিগুলি ছাড়াই কীভাবে নির্ভরযোগ্যভাবে বৃহত সূচকীয় পদ যুক্ত করা যায়?


24

মারকভ চেইন মন্টি কার্লোতে একটি খুব সাধারণ সমস্যা হ'ল কম্পিউটারের সম্ভাব্যতাগুলির সাথে জড়িত যা বৃহত ক্ষতিকারক পদগুলির যোগফল,

ea1+ea2+...

যেখানে উপাদান খুব বড় খুব ছোট থেকে বিস্তৃত হতে পারে। আমার পদ্ধতির সবচেয়ে বড় শব্দটি যাতে:কে : = সর্বোচ্চ আমি ( একটি আমি )aK:=maxi(ai)

a=K+log(ea1K+ea2K+...)
eaea1+ea2+...

এই পদ্ধতির যুক্তিসঙ্গত যদি a এর সমস্ত উপাদান বড় হয় তবে এগুলি ভাল ধারণা না হলে idea অবশ্যই, ছোট উপাদানগুলি যাইহোক ফ্লোটিং-পয়েন্ট যোগফলকে অবদান রাখছে না, তবে কীভাবে নির্ভরযোগ্যভাবে সেগুলি মোকাবেলা করতে হবে তা সম্পর্কে আমি নিশ্চিত নই। আর কোডে আমার পদ্ধতির মত দেখাচ্ছে:

if ( max(abs(a)) > max(a) )
  K <-  min(a)
else
  K <- max(a)
ans <- log(sum(exp(a-K))) + K

এটি একটি সাধারণ যথেষ্ট সমস্যা বলে মনে হচ্ছে যে এখানে একটি স্ট্যান্ডার্ড সমাধান হওয়া উচিত, তবে আমি নিশ্চিত না যে এটি কী। কোন পরামর্শের জন্য ধন্যবাদ।


1
এটি একটি জিনিস। 'লগসুমে এক্সপ্লেক্স' এর জন্য গুগল।

উত্তর:


15

ডেটা দিয়ে কেবল দুটি পাস সহ একটি সরল সমাধান রয়েছে:

প্রথম গণনা

K:=maxiai,

যা আপনাকে জানায় যে, যদি পদ থাকে তবে then Σ আমিএকটি আমিএন কেn

ieaineK.

আপনি সম্ভবতঃ হবে না যেহেতু যে কোন জায়গায় কাছাকাছি বৃহৎ হিসাবে হিসাবে এমনকি , আপনি গণনার তুলনায় বহুগুণ সম্পর্কে কোনো চিন্তা থাকা উচিত ডবল স্পষ্টতা মধ্যে ।10 20 τ : = i e a i - Knn1020

τ:=ieaiKn

সুতরাং, গণনা এবং তারপরে আপনার সমাধানটি হ'ল ।কে ττeKτ


সুস্পষ্ট স্বরলিপিটির জন্য ধন্যবাদ - তবে আমি বিশ্বাস করি এটি মূলত আমি প্রস্তাব করেছি (?) যখন কিছু ছোট হয় তখন আমার যদি যাওয়ার ত্রুটিগুলি এড়াতে হয় তবে আমি জড়ো আমার @ গ্যারথে প্রস্তাবিত কাহান সামিট পদ্ধতির প্রয়োজন ? ai
cboettig

আহ, আমি এখন দেখছি আপনি কী পেলেন। আপনার স্রোতের বিষয়ে আসলে চিন্তা করার দরকার নেই, কারণ আপনার সমাধানে অতিমাত্রায় ক্ষুদ্র ফলাফল যুক্ত করা এটি পরিবর্তন করা উচিত নয়। যদি তাদের মধ্যে ব্যতিক্রমী সংখ্যক সংখ্যা ছিল, তবে আপনার প্রথমে ছোট মানগুলি যোগ করা উচিত।
জ্যাক পলসন

ডাউনওয়োটারের কাছে: আমার উত্তরটিতে কি ভুল তা আপনি আমাকে জানাতে আপত্তি করবেন?
জ্যাক পলসন

কি যদি আপনি অনেক খুব ছোট পদ? এটি ঘটতে পারে যে এগুলির জন্য । যদি এরকম অনেক শর্ত থাকে তবে আপনার একটি বড় ত্রুটি হবে। eaiK0
বেকো


10

আপনি একসাথে ডাবল যুক্ত করার সময় যথাযথতা বজায় রাখার জন্য আপনাকে কাহান সামোমেশন ব্যবহার করতে হবে , এটি সফ্টওয়্যারটি একটি ক্যারি রেজিস্টার থাকার সমতুল্য।

এটা হল সবচেয়ে মানের জন্য জরিমানা, কিন্তু আপনি যদি ওভারফ্লো তারপর পাচ্ছেন আপনি সীমা আঘাত করছে আইইইই 754 ডাবল স্পষ্টতা যা সম্পর্কে হবে । এই মুহুর্তে আপনার একটি নতুন উপস্থাপনা দরকার। আপনি সংযোজন করার সময় অতিরিক্ত সময়ে একটি ওভারফ্লো শনাক্ত করতে পারেন এবং এটির দ্বারা মূল্যায়নের জন্য এক্সপোশনগুলিও সনাক্ত করতে পারেন । এই মুহুর্তে আপনি এক্সপোজনটি স্থানান্তরিত করে এবং এই শিফটের ট্র্যাক রেখে একটি ডাবলের ব্যাখ্যাটি সংশোধন করতে পারেন।e709.783doubleMax - sumSoFar < valueToAddexponent > 709.783

এটি বেশিরভাগ অংশের জন্য আপনার এক্সপোনেন্ট অফসেট পদ্ধতির অনুরূপ, তবে এই সংস্করণটি এটিকে বেস 2 এ রাখা হয় এবং বৃহত্তম সন্ধানকারীটিকে সন্ধানের জন্য প্রাথমিক অনুসন্ধানের প্রয়োজন হয় না। অত: পর ।value×2shift

#!/usr/bin/env python
from math import exp, log, ceil

doubleMAX = (1.0 + (1.0 - (2 ** -52))) * (2 ** (2 ** 10 - 1))

def KahanSumExp(expvalues):
  expvalues.sort() # gives precision improvement in certain cases 
  shift = 0 
  esum = 0.0 
  carry = 0.0 
  for exponent in expvalues:
    if exponent - shift * log(2) > 709.783:
      n = ceil((exponent - shift * log(2) - 709.783)/log(2))
      shift += n
      carry /= 2*n
      esum /= 2*n
    elif exponent - shift * log(2) < -708.396:
      n = floor((exponent - shift * log(2) - -708.396)/log(2))
      shift += n
      carry *= 2*n
      esum *= 2*n
    exponent -= shift * log(2)
    value = exp(exponent) - carry 
    if doubleMAX - esum < value:
      shift += 1
      esum /= 2
      value /= 2
    tmp = esum + value 
    carry = (tmp - esum) - value 
    esum = tmp
  return esum, shift

values = [10, 37, 34, 0.1, 0.0004, 34, 37.1, 37.2, 36.9, 709, 710, 711]
value, shift = KahanSumExp(values)
print "{0} x 2^{1}".format(value, shift)

কাহান সমষ্টি কেবলমাত্র "ক্ষতিপূরণ সমষ্টি" পদ্ধতিগুলির মধ্যে একটি। যদি কোনও কারণে কাহান পুরোপুরি সঠিকভাবে কাজ না করে তবে বিভিন্ন ধরণের বিবিধ পদ এবং বিপরীত লক্ষণগুলি সঠিকভাবে যুক্ত করার জন্য আরও কয়েকটি পদ্ধতি রয়েছে।
জেএম

@ জেএম আপনি কি আমাকে এই অন্যান্য পদ্ধতির নাম সরবরাহ করতে পারেন, সেগুলি পড়তে আমি আগ্রহী হব। ধন্যবাদ।
গ্যারেথ এ। লয়েড

1

আপনার পদ্ধতির দৃ is়।

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


0

একটি আর প্যাকেজ রয়েছে যা "লগ-সম-এক্সপ্রেস কৌশল" এর দ্রুত এবং দক্ষ প্রয়োগের সরবরাহ করে

http://www.inside-r.org/packages/cran/matrixStats/docs/logSumExp

লগসুমএক্সপ ফাংশন একটি সংখ্যক ভেক্টর এলএক্স গ্রহণ করে এবং আপনার বর্ণিত পদ্ধতিটি ব্যবহার করে পাতাল এবং ওভারফ্লো সমস্যাগুলি এড়িয়ে গিয়ে লগ (যোগফল (এক্সপ্রেস (এলএক্স)) আউটপুট করে।

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