ค้นหาบรรทัดที่เหมาะกับข้อมูลมากที่สุด

ฉันกำลังพยายามค้นหาบรรทัดที่เหมาะกับข้อมูลมากที่สุด ฉันใช้โค้ดต่อไปนี้ แต่ตอนนี้ ฉันต้องการให้ข้อมูลอยู่ในอาร์เรย์เรียงลำดับ เพื่อให้มีข้อมูลที่ใกล้กับบรรทัดมากที่สุดก่อน ฉันจะทำอย่างไร นอกจากนี้ polyfit ยังเป็นฟังก์ชันที่ถูกต้องอีกด้วย เพื่อใช้สิ่งนี้เหรอ?

x=[1,2,2.5,4,5];
y=[1,-1,-.9,-2,1.5];
n=1;
p = polyfit(x,y,n)

f = polyval(p,x);
plot(x,y,'o',x,f,'-')

รูปภาพ

PS: ฉันใช้ Octave 4.0 ซึ่งคล้ายกับ Matlab


person Rick T    schedule 28.02.2017    source แหล่งที่มา


คำตอบ (3)


ก่อนอื่น คุณสามารถคำนวณข้อผิดพลาดระหว่างค่าจริง y และค่าที่ทำนายไว้ f

err = abs(y-f);

จากนั้นเรียงลำดับเวกเตอร์ข้อผิดพลาด

[val, idx] = sort(err);

และใช้ดัชนีที่เรียงลำดับเพื่อเรียงลำดับค่า y ของคุณ

y2 = y(idx);

ตอนนี้ y2 มีค่าเหมือนกับ y แต่ค่าที่ใกล้กับค่าที่เหมาะสมก่อน

ทำแบบเดียวกันกับ x เพื่อคำนวณ x2 คุณจะได้ค่าที่สอดคล้องกันระหว่าง x2 ถึง y2

x2 = x(idx);
person Sembei Norimaki    schedule 28.02.2017

Sembei Norimaki อธิบายคำถามหลักของคุณได้ดี ดังนั้นฉันจะดูคำถามรองของคุณ = is is polyfit the right function หรือไม่?

เส้นที่พอดีที่สุดถูกกำหนดให้เป็นเส้นที่มีค่าคลาดเคลื่อนเฉลี่ยเป็นศูนย์

หากต้องเป็น "เส้น" เราสามารถใช้ polyfit ซึ่งจะพอดีกับพหุนาม แน่นอนว่า "เส้นตรง" สามารถนิยามได้ว่าเป็นพหุนามดีกรีที่ 1 แต่พหุนามดีกรีที่ 1 มีคุณสมบัติบางอย่างที่ทำให้ง่ายต่อการจัดการ สมการพหุนามลำดับแรก (หรือเชิงเส้น) ที่คุณกำลังมองหาควรอยู่ในรูปแบบนี้:

y = mx + b

โดยที่ y คือตัวแปรตามของคุณและ X คือตัวแปรอิสระของคุณ ดังนั้นความท้าทายก็คือ: ค้นหา m และ b เพื่อให้โมเดล y ใกล้เคียงกับ y จริงมากที่สุด ปรากฎว่าข้อผิดพลาดที่เกี่ยวข้องกับความพอดีเชิงเส้นนั้นนูนออกมา ซึ่งหมายความว่ามีค่าต่ำสุดเพียงค่าเดียว ในการคำนวณค่าต่ำสุดนี้ วิธีที่ง่ายที่สุดในการรวมไบแอสและเวกเตอร์ x ดังต่อไปนี้:

Xcombined = [x.' ones(length(x),1)];

แล้วจึงใช้สมการปกติซึ่งได้มาจากการลดข้อผิดพลาดให้เหลือน้อยที่สุด

beta = inv(Xcombined.'*Xcombined)*(Xcombined.')*(y.')

เยี่ยมมาก ตอนนี้บรรทัดของเราถูกกำหนดเป็น Y = Xcombined*beta หากต้องการลากเส้น เพียงสุ่มตัวอย่างจากช่วง x แล้วบวกเทอม b

Xplot = [[0:.1:5].' ones(length([0:.1:5].'),1)];
Yplot = Xplot*beta;
plot(Xplot, Yplot);

แล้วเหตุใด polyfit จึงทำงานได้ไม่ดีนัก? ผมบอกแน่นอนไม่ได้ แต่สมมุติฐานของผมคือคุณต้องย้ายเมทริกซ์ x กับ y ฉันเดาว่านั่นจะทำให้คุณมีบรรทัดที่สมเหตุสมผลมากขึ้น

x = x.';
y = y.';

แล้วลอง

p = polyfit(x,y,n)

ฉันหวังว่านี่จะช่วยได้. นักปราชญ์เคยบอกฉัน (และในขณะที่ฉันเรียนรู้ทุกวัน) อย่าเชื่ออัลกอริธึมที่คุณไม่เข้าใจ!

person David Kaftan    schedule 01.03.2017
comment
x และ y เป็นเวกเตอร์ การย้ายพวกมันจะไม่มีผลใดๆ ตัวอย่างในคำถามมีผลการถดถอยต่ำมาก เนื่องจากอย่างที่คุณเห็นว่าความสัมพันธ์ของข้อมูลต่ำมาก การถดถอยไม่สามารถทำให้เกิดเวทย์มนตร์ได้ ดังนั้นหากคุณต้องการจัดบรรทัดให้พอดีกับข้อมูลที่มีความสัมพันธ์ต่ำ คุณควรคาดหวังว่าจะเกิดข้อผิดพลาดใหญ่ ยังไงก็ได้รับคำแนะนำดีๆ จากปราชญ์ครับ - person Sembei Norimaki; 01.03.2017
comment
ใช่ มองย้อนกลับไปไม่รู้ว่าฉันคิดอะไรอยู่ ไม่มีเหตุผลที่จะเกิดปัญหาอย่างแน่นอน ฉันเดาว่าฉันคิดว่ามันอาจจะถือว่าชุดการฝึกอบรมเป็นชุดข้อมูล 5 คุณลักษณะ 1 ตัวอย่าง - person David Kaftan; 05.12.2018

ต่อไปนี้เป็นโค้ดทดสอบบางส่วนที่อาจช่วยผู้อื่นเกี่ยวกับการถดถอยเชิงเส้นและกำลังสองน้อยที่สุด

%https://youtu.be/m8FDX1nALSE รหัส Matlab

%https://youtu.be/1C3olrs1CUw วิดีโอดีๆ สำหรับออกกำลังกายด้วยมือหากคุณต้องการทดสอบ

function [a0 a1] = rtlinreg(x,y) 
  x=x(:);
  y=y(:);
  n=length(x);
  a1 = (n*sum(x.*y) - sum(x)*sum(y))/(n*sum(x.^2) - (sum(x))^2);  %a1 this is the slope of linear model
  a0 = mean(y) - a1*mean(x); %a0 is the y-intercept
end

x=[65,65,62,67,69,65,61,67]'
y=[105,125,110,120,140,135,95,130]'

[a0 a1] = rtlinreg(x,y);  %a1 is the slope of linear model, a0 is the y-intercept

x_model =min(x):.001:max(x);
y_model = a0 + a1.*x_model;  %y=-186.47 +4.70x   
plot(x,y,'x',x_model,y_model)
person Rick T    schedule 01.03.2017