سؤال

أنا أبحث عن روتين منحنى غير خطي (من المحتمل أن يكون من المحتمل أن يكون موجودًا في R أو Python ، لكنني منفتح على لغات أخرى) والتي ستستغرق بيانات X و Y وتتناسب مع منحنى لها.

يجب أن أكون قادرًا على تحديد نوع التعبير الذي أريده.

أمثلة:

"A+B*x+C*x*x"
"(A+B*x+C*x*x)/(D*x+E*x*x)"
"sin(A+B*x)*exp(C+D*x)+E+F*x"

ما سأخرجه من هذا هو على الأقل قيم الثوابت (A ، B ، C ، إلخ) ونأمل أن تكون إحصائيات حول ملاءمة المباراة.

هناك برامج تجارية للقيام بذلك ، لكنني كنت أتوقع أن أتمكن من العثور على شيء شائع مثل مناسب للتعبير المطلوب في مكتبة لغوية في الوقت الحاضر. أظن أن أشياء تحسين Scipy قد تكون قادرة على القيام بذلك ، لكن لا يمكنني أن أرى أنها تتيح لي تحديد معادلة. وبالمثل ، لا يمكنني العثور على ما أريده بالضبط في R.

هل ما أبحث عنه هناك ، أم أحتاج إلى لف بلدي؟ أكره أن أفعل ذلك إذا كان هناك وأواجه مشكلة في العثور عليه.


تحرير: أريد أن أفعل ذلك من أجل التحكم في العملية أكثر قليلاً مما أحصل عليه من Lab Fit. مختبر FIT UI مروع. أود أيضًا أن أكون قادرًا على تقسيم النطاق إلى قطع متعددة ولدي منحنيات مختلفة تمثل الأجزاء المختلفة من النطاق. في النهاية ، يجب أن تكون النتيجة قادرة على (سرعة) التغلب على LUT مع الاستيفاء الخطي أو لست مهتمًا.

في مجموعة المشكلات الحالية الخاصة بي ، لدي وظائف ثلاثية أو exp () وأحتاج إلى تنفيذها 352،800 مرة في الثانية في الوقت الفعلي (واستخدم فقط جزءًا من وحدة المعالجة المركزية). لذلك أرسم المنحنى وأستخدم البيانات لدفع مجرب المنحنى للحصول على تقريب أقل تكلفة. في الأيام الخوالي ، كان اللوتس دائمًا هو الحل ، ولكن في الوقت الحاضر ، يكون تخطي عمليات البحث عن الذاكرة والتقريب أسرع في بعض الأحيان.

هل كانت مفيدة؟

المحلول

للإجابة على سؤالك بالمعنى العام (فيما يتعلق بتقدير المعلمة في ص) دون النظر في تفاصيل المعادلات التي أشرت إليها ، أعتقد أنك تبحث عن NLS () أو Optim () ... "NLS" هو خياري الأول كـ يوفر تقديرات خطأ لكل معلمة مقدرة وعندما تفشل في استخدام "Optim". إذا كان لديك متغيرات X ، Y:

out <- tryCatch(nls( y ~ A+B*x+C*x*x, data = data.frame(x,y), 
                start = c(A=0,B=1,C=1) ) ,
                error=function(e) 
                optim( c(A=0,B=1,C=1), function(p,x,y)  
                      sum((y-with(as.list(p),A + B*x + C*x^2))^2), x=x, y=y) )

للحصول على المعاملات ، شيء مثل

getcoef <- function(x) if(class(x)=="nls") coef(x) else x$par
getcoef(out)

إذا كنت تريد الأخطاء القياسية في حالة "NLS" ،

summary(out)$parameters

تحتوي ملفات المساعدة ووظائف القائمة البريدية لـ R-HELP على العديد من المناقشات المتعلقة بخوارزميات التقليل المحددة التي تنفذها كل منها (الافتراضي المستخدم في كل حالة مثال أعلاه) ومدى ملاءمتها للشكل المحدد للمعادلة. يمكن لبعض الخوارزميات التعامل مع قيود الصندوق ، وستتعامل وظيفة أخرى تسمى Constroptim () مع مجموعة من القيود الخطية. قد يساعد هذا الموقع أيضًا:

http://cran.r-project.org/web/views/optimization.html

نصائح أخرى

نموذجك الأول هو في الواقع خطي في المعلمات الثلاثة ويمكن أن تكون لائقة في R باستخدام

 fit <- lm(y ~ x + I(x^2), data=X)

والتي ستحصل على المعلمات الثلاثة الخاصة بك.

يمكن أيضًا أن يكون النموذج الثاني مناسبًا لاستخدامه nls() في R مع التحذيرات المعتادة من الاضطرار إلى توفير قيم البدء وما إلى ذلك إحصائي القضايا في التحسين ليست بالضرورة هي نفسها عددي المشكلات - لا يمكنك فقط تحسين أي نموذج وظيفي بغض النظر عن اللغة التي تختارها.

الدفع جنو أوكتاف - بين polyfit () والقيود غير الخطية ، يجب أن يكون من الممكن بناء شيء مناسب لمشكلتك.

في R ، هذا سهل للغاية.

وتسمى الطريقة المدمجة في Optim (). يأخذ كوسائط متجه بداية للمعلمات المحتملة ، ثم وظيفة. عليك أن تبني وظيفة الخطأ الخاصة بك ، ولكن هذا بسيط حقًا.

ثم تسميها مثل Out = Optim (1 ، err_fn)

حيث err_fn هو

err_fn = function(A) {
    diff = 0;
    for(i in 1:data_length){
      x = eckses[i];
      y = data[i];
      model_y = A*x;
      diff = diff + ( y - model_y )^2
    }
    return(diff);
}

هذا يفترض فقط أن لديك متجهًا من قيم x و y في eckses والبيانات. قم بتغيير خط Model_y كما ترى مناسبًا ، حتى إضافة المزيد من المعلمات.

إنه يعمل على غير الخطية على ما يرام ، وأنا أستخدمه في منحنيات E^X بأربعة أبعاد وهي سريعة جدًا. تتضمن بيانات الإخراج قيمة الخطأ في نهاية التركيب ، وهو مقياس لمدى تناسقه ، المعطى كمجموع من الاختلافات المربعة (في err_fn).

تحرير: إذا كنت بحاجة إلى أخذ النموذج كسلسلة ، فيمكنك أن تقوم واجهة المستخدم بإنشاء عملية تركيب النموذج بالكامل هذه كنصي R وتحميلها لتشغيلها. يمكن أن تأخذ R نصًا من stdin أو من ملف ، لذلك لا ينبغي أن يكون من الصعب للغاية صياغة سلسلة هذه الوظيفة ، وجعلها تعمل بشكل أمين تلقائيًا.

ربما لن تجد روتينًا واحدًا مع المرونة المتضمنة في الأمثلة الخاصة بك (كثير الحدود والوظائف العقلانية باستخدام نفس الروتين) ، ناهيك عن تحليل سلسلة لمعرفة نوع المعادلة التي يجب ملائمةها.

سيكون المربعات الصلبة المربعة متعددة الحدود مناسبة لمثالك الأول. (الأمر متروك لك ما هي درجة الحمل لاستخدامها - الرباعي ، المكعب ، الرباعي ، إلخ). للحصول على وظيفة عقلانية مثل مثالك الثاني ، قد تضطر إلى "لف الخاص بك" إذا لم تتمكن من العثور على مكتبة مناسبة. أيضًا ، ضع في اعتبارك أنه يمكن استخدام متعدد الحدود العالية بما فيه الكفاية لتقريب وظيفتك "الحقيقية" ، طالما أنك لا تحتاج إلى استقراء ما وراء حدود مجموعة البيانات التي تناسبها.

كما لاحظ آخرون ، هناك خوارزميات تقدير معلمة أكثر تعميماً والتي قد تكون مفيدة أيضًا. لكن هذه الخوارزميات ليست "توصيلًا ولعبًا": فهي عادة ما تتطلب منك كتابة بعض إجراءات المساعد ، وتزويد قائمة بالقيم الأولية لمعلمات النموذج. من الممكن أن تتناقض هذه الأنواع من الخوارزميات ، أو تتعثر في الحد الأدنى أو الحد الأقصى المحلي للاختيار غير المحظوظ لتقديرات المعلمات الأولية.

إذا كان لديك قيود على معاملاتك ، وكنت تعلم أن هناك نوعًا محددًا من الوظائف التي تريد أن تتناسب مع بياناتك وهذه الوظيفة هي طريقة فوضوية حيث لن تعمل طرق الانحدار القياسية أو طرق تركيب المنحنى الأخرى ، هل فكرت في الخوارزميات الوراثية؟

إنها ليست خياري الأول ، ولكن إذا كنت تحاول العثور على معاملات الوظيفة الثانية التي ذكرتها ، فربما يعمل الغاز-خاصة إذا كنت تستخدم مقاييس غير قياسية لتقييم أفضل ملاءمة. على سبيل المثال ، إذا كنت ترغب في العثور على معاملات "(A+BX+CX^2)/(DX+EX^2)" بحيث يكون مجموع الاختلافات المربعة بين وظيفتك والبيانات الحد الأدنى و أن يكون هناك بعض القيود على طول الوظيفة الناتجة ، ثم قد تكون الخوارزمية العشوائية وسيلة جيدة للتعامل مع هذا.

بعض التحذيرات: 1) لن تضمن الخوارزميات العشوائية أفضل الحل ، لكنها غالبًا ما تكون قريبة جدًا. 2) عليك أن تكون حذرا بشأن استقرار الخوارزمية.

في ملاحظة أطول ، إذا كنت في المرحلة التي تريد أن تجد فيها وظيفة من بعض الوظائف التي تناسب بياناتك (على سبيل المثال ، لن تفرض ، على سبيل المثال ، النموذج الثاني على بياناتك) ، ثم الوراثي قد تساعد تقنيات البرمجة أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top