ผมมีข้อมูลที่อยู่ในรูปx)} สำหรับการประมาณถึงฉันใช้สูตรของบทความนี้: จอห์นฟ็อกซ์ - การถดถอยแบบไม่เชิงเส้นและสแควร์สแบบไม่เชิงเส้น ในบทความนี้ถูกประเมินโดยการดูข้อมูล ถ้าฉันทำมันได้ผลแม้ว่าฉันจะมีแค่สามคะแนน จากนั้นฉันสามารถคำนวณอีกสองอัน ฉันทดสอบพารามิเตอร์ด้วย nls () ใน R และ LevenbergMarquardt ใน C # โมเดลที่ส่งคืนโดยพวกเขาพอใจ
ปัญหาคือฉันไม่ต้องการดูข้อมูลเพื่อรับตัวประมาณที่ดีสำหรับฉันต้องการให้โปรแกรมคำนวณมัน บางครั้งฉันใช้ค่าที่สูงกว่าค่าสูงสุดของฉันเล็กน้อย (บางสิ่งระหว่างถึง\ max * 1.5มันใช้งานได้ดีตราบใดที่คะแนนครอบคลุมฟังก์ชั่นส่วนใหญ่ จุดข้อมูลอยู่ที่ไหนสักแห่งจาก "ด้านบน" ของเส้นโค้ง แต่เมื่อพวกเขาทั้งหมดมาจากพื้นที่ "ด้านล่าง" จุดเบี่ยงเบนตัวประมาณนี้ต่ำกว่าที่ควรจะเป็นแน่นอนและฉันไม่เหมาะกับแบบจำลองถ้าฉันใช้บางอย่าง นั่นสูงกว่าจุดสูงสุดแน่นอน (โดยการคูณด้วยค่าที่สูงอย่างน่าขัน) โมเดลไม่เหมาะกับวิธีที่มีประโยชน์ใด ๆ
การวัดอาจมีลักษณะเช่นนี้:
x = (40, 50, 60, 70), y = (1,000, 950, 400, 200) -> ง่ายต่อการประมาณ
x = (40, 50, 60, 70), y = (1,000, 950, 800, 100) -> ง่ายต่อการประมาณ
x = (40, 50, 60, 70), y = (500, 200, 100, 50) -> ไม่ง่ายที่จะประมาณ
ฉันเดาว่าฉันสามารถรู้ได้ว่าฉันอยู่ที่ไหนในฟังก์ชั่น (ที่ "ด้านล่าง", ที่ "ด้านบน", ในความลาดชัน) โดยการคำนวณ delta ในจุดที่กำหนดและคำนวณขอบเขตบนขึ้นอยู่กับว่า ไม่มีใครมีคำแนะนำสำหรับการแก้ปัญหาที่ดีกว่า? ข้อมูลเพิ่มเติม: หากไม่สามารถทำได้สิ่งที่สำคัญกว่าสำหรับฉันคือการวัดที่พอดีได้ดีที่สุดและฉันยอมรับว่าการวัดบางอย่างไม่สามารถทำได้เลย
(แม้ว่าฉันต้องการการนำไปใช้ใน C # ฉันโพสต์ไว้ที่นี่ แต่ฉันไม่คิดว่าปัญหาจะขึ้นอยู่กับภาษา)
อัปเดต (แอปพลิเคชันนี้):
x คือค่าอุณหภูมิและการวัดที่สอดคล้องกัน โดยธรรมชาติแล้วจะได้รับมันควรมีลักษณะโค้งโลจิสติกที่มีค่า y สูงกว่าที่อุณหภูมิต่ำกว่าและในทางกลับกัน จุดหลอมเหลวเท่ากับจุดเปลี่ยนความโค้งของเส้นโค้งซึ่งเปลี่ยนแปลงไปมากด้วยการเปลี่ยนแปลงเล็กน้อยของพารามิเตอร์แบบจำลอง
อัปเดต (บางส่วนประกอบด้วยข้อมูล 7 จุดข้อมูลและจุดผันโรคที่รู้จักกันที่ 60):
//first I made up some data without any noise and enough (13) points
double[] x17 = { 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90 };
double[] y17 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 59.642....
//Then I took three different parts of that data
(to simulate how much data I will have in the real world)
double[] x18 = { 30, 35, 40, 45, 50, 55, 60 };
double[] y18 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000 };
//calculated inflection point: 59.263.... is ok!
double[] x19 = { 60, 65, 70, 75, 80, 85, 90 };
double[] y19 = { 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 53.447.... to small!
double[] x20 = { 45, 50, 55, 60, 65, 70, 75 };
double[] y20 = { 1700, 1500, 1280, 1000, 720, 500, 300 };
//calculated inflection point: 59.868... almost perfect!
แนวทางปัจจุบันของฉันสำหรับการประมาณขอบเขตบนคือ y0 * y0 / y1 วิธีนี้ฉันหวังว่าจะคำนึงถึงว่าฉันอาจไม่ได้มีค่าใกล้เคียงกับค่าสูงสุดเสมอไป
อัปเดต: ค่า x และ y จะไม่ติดลบ x จะเป็น {40, 45, 50, 55, 60, 65, 70} เว้นแต่ว่าจุดข้อมูลจะหายไป
อัปเดต: ฉันทำการทดสอบจำนวนมากด้วยข้อมูลจำลองที่ควรจะพอดี (ฉันเลือกจุดข้อมูลที่อยู่บนเส้นโค้ง = โดยไม่มีเสียงรบกวน) และฉันเห็นว่ามันทำงานได้ดีเว้นแต่จุดข้อมูลแรกหรือจุดที่สอง (ที่ x = 40 หรือ x = 45) หายไป ฉันเดาว่าฉันจะต้องทิ้งการวัดแบบนี้และผู้ใช้จะต้องอยู่กับมัน