สิ่งที่คุณทำผิด: มันไม่สมเหตุสมผลเลยที่จะคำนวณ PRESS สำหรับ PCA อย่างนั้น! ปัญหาอยู่ในขั้นตอนที่ # 5 ของคุณ
วิธีการไร้เดียงสาเพื่อกดสำหรับ PCA
ให้ชุดข้อมูลประกอบด้วยคะแนนในพื้นที่มิติ:n ในการคำนวณข้อผิดพลาดในการสร้างใหม่สำหรับจุดข้อมูลการทดสอบเดียวคุณดำเนินการ PCA ในชุดการฝึกอบรมโดยที่ไม่รวมประเด็นนี้ให้ใช้จำนวนของแกนหลัก เป็นคอลัมน์ของและพบข้อผิดพลาดในการสร้างใหม่เป็น 2 กดเท่ากับผลรวมของตัวอย่างทดสอบทั้งหมดd x ( i ) ∈ R d ,ndx(i)∈Rd,i=1…nx(i)X(−i)kU(−i)∥∥x(i)−x^(i)∥∥2=∥∥x(i)−U(−i)[U(−i)]⊤x(i)∥∥2iดังนั้นสมการที่สมเหตุสมผลน่าจะเป็น:
PRESS=?∑i=1n∥∥x(i)−U(−i)[U(−i)]⊤x(i)∥∥2.
เพื่อความเรียบง่ายฉันไม่สนใจปัญหาของการตั้งศูนย์และปรับขนาดที่นี่
วิธีการไร้เดียงสาผิด
ปัญหาข้างต้นคือเราใช้เพื่อคำนวณการคาดการณ์และนั่นเป็นสิ่งที่แย่มากx(i)x^(i)
สังเกตเห็นความแตกต่างที่สำคัญกับกรณีการถดถอยที่สูตรการสร้างข้อผิดพลาดโดยพื้นฐานแล้วคือแต่การทำนาย จะคำนวณโดยใช้ตัวแปรและไม่ใช้{(i)} สิ่งนี้เป็นไปไม่ได้ใน PCA เนื่องจากใน PCA ไม่มีตัวแปรตามและอิสระ: ตัวแปรทั้งหมดได้รับการปฏิบัติด้วยกัน∥∥y(i)−y^(i)∥∥2y^(i)y(i)
ในทางปฏิบัติหมายความว่าการกดที่คำนวณไว้ข้างต้นสามารถลดลงได้ด้วยการเพิ่มจำนวนของส่วนประกอบและไม่เคยถึงขั้นต่ำสุด ซึ่งจะนำไปสู่การคิดว่าทุกองค์ประกอบมีความสำคัญ หรือในบางกรณีอาจถึงขั้นต่ำ แต่ก็ยังมีแนวโน้มที่จะทำให้มีมิติที่ดีที่สุดและประเมินค่าสูงไปkd
แนวทางที่ถูกต้อง
มีหลายวิธีที่เป็นไปได้ดูBro et al (2008) การตรวจสอบความถูกต้องของโมเดลส่วนประกอบ: การตรวจสอบวิธีการที่สำคัญในปัจจุบันสำหรับภาพรวมและการเปรียบเทียบ วิธีหนึ่งคือออกจากมิติข้อมูลหนึ่งจุดในแต่ละครั้ง (เช่นแทน ) เพื่อให้ข้อมูลการฝึกอบรมกลายเป็นเมทริกซ์ที่มีค่าขาดหายไปหนึ่งค่า และจากนั้นเพื่อทำนาย ("impute") ค่าที่หายไปนี้ด้วย PCA (แน่นอนหนึ่งสามารถสุ่มถือส่วนเมทริกซ์ที่มีขนาดใหญ่กว่าเช่น 10%) ปัญหาคือการคำนวณ PCA ที่มีค่าที่หายไปนั้นสามารถคำนวณได้ค่อนข้างช้า (ขึ้นอยู่กับอัลกอริธึม EM) แต่ต้องทำซ้ำหลาย ๆ ครั้งที่นี่ อัปเดต: ดูhttp://alexhwilliams.info/itsneuronalblog/2018/02/26/crossval/x(i)jx(i) สำหรับการสนทนาที่ดีและการใช้งาน Python (PCA ที่มีค่าที่ขาดหายไปจะถูกนำไปใช้ผ่านการสลับกำลังสองน้อยที่สุด)
วิธีการที่ฉันพบว่าใช้งานได้จริงมากขึ้นคือการทิ้งจุดข้อมูลหนึ่งจุดในแต่ละครั้งให้คำนวณ PCA ในข้อมูลการฝึกอบรม (ตรงกับด้านบน) แต่จากนั้นวนรอบมิติของปล่อยพวกมันทีละตัวและคำนวณข้อผิดพลาดในการสร้างใหม่โดยใช้ส่วนที่เหลือ สิ่งนี้อาจสร้างความสับสนในการเริ่มต้นและสูตรมีแนวโน้มที่จะยุ่งเหยิง แต่การนำไปปฏิบัติค่อนข้างตรงไปตรงมา ก่อนอื่นให้ฉันทำสูตร (ค่อนข้างน่ากลัว) แล้วอธิบายสั้น ๆ :x(i)x(i)
PRESSPCA=∑i=1n∑j=1d∣∣∣x(i)j−[U(−i)[U(−i)−j]+x(i)−j]j∣∣∣2.
ลองพิจารณาวงในที่นี่ เราออกจากจุดหนึ่งและคำนวณองค์ประกอบหลักเกี่ยวกับข้อมูลการฝึกอบรมi)} ตอนนี้เรารักษาแต่ละค่าเป็นแบบทดสอบและใช้ส่วนที่เหลือเพื่อทำการคาดการณ์ . การทำนายเป็นพิกัด -th ของ "การฉายภาพ" (ในความหมายกำลังสองน้อยที่สุด) ของลงบนสเปซ โดยi)} ในการคำนวณหาจุดในพื้นที่ PCที่ใกล้เคียงที่สุดx(i)kU(−i)x(i)jx(i)−j∈Rd−1x^(i)jjx(i)−jU(−i)z^Rkx(i)−jโดยการคำนวณโดยที่คือพร้อมแถว -th เตะออกแล้วและย่อมาจาก pseudoinverse ตอนนี้แผนที่กลับสู่พื้นที่เดิม:และใช้เวลาของ -th ประสานงาน[\ z^=[U(−i)−j]+x(i)−j∈RkU(−i)−jU(−i)j[⋅]+z^U(−i)[U(−i)−j]+x(i)−jj[⋅]j
การประมาณค่ากับวิธีการที่ถูกต้อง
ฉันไม่เข้าใจการปรับมาตรฐานเพิ่มเติมที่ใช้ใน PLS_Toolbox แต่นี่เป็นวิธีหนึ่งที่ไปในทิศทางเดียวกัน
มีวิธีอื่นในการแมปบนพื้นที่ของส่วนประกอบหลัก:นั่นคือเพียงแค่เปลี่ยนทรานแซกชันแทนหลอก - ผกผัน กล่าวอีกนัยหนึ่งมิติที่เหลือไว้สำหรับการทดสอบจะไม่ถูกนับรวมและน้ำหนักที่สอดคล้องกันก็จะถูกเตะออกไป ฉันคิดว่าสิ่งนี้ควรมีความแม่นยำน้อยกว่า แต่บ่อยครั้งอาจยอมรับได้ สิ่งที่ดีคือตอนนี้สูตรผลลัพธ์สามารถเป็น vectorized ได้ดังนี้ (ฉันไม่ได้คำนวณ):x(i)−jz^approx=[U(−i)−j]⊤x(i)−j
PRESSPCA,approx=∑i=1n∑j=1d∣∣∣x(i)j−[U(−i)[U(−i)−j]⊤x(i)−j]j∣∣∣2=∑i=1n∥∥(I−UU⊤+diag{UU⊤})x(i)∥∥2,
โดยที่ฉันเขียนเป็นเพื่อความกะทัดรัดและหมายถึงการตั้งค่าองค์ประกอบที่ไม่ใช่แนวทแยงทั้งหมดให้เป็นศูนย์ โปรดทราบว่าสูตรนี้ดูเหมือนว่าสูตรแรก (ซื่อๆไร้เดียงสา) ที่มีการแก้ไขเล็กน้อย! โปรดทราบว่าการแก้ไขนี้ขึ้นอยู่กับแนวทแยงมุมของเช่นเดียวกับในรหัส PLS_Toolbox อย่างไรก็ตามสูตรนี้ยังคงแตกต่างจากที่ใช้ใน PLS_Toolbox และความแตกต่างนี้ฉันไม่สามารถอธิบายได้U(−i)Udiag{⋅}UU⊤
Update (ก.พ. 2018):ด้านบนฉันเรียกขั้นตอนหนึ่งว่า "ถูกต้อง" และอีก "โดยประมาณ" แต่ฉันไม่แน่ใจอีกต่อไปว่านี่จะมีความหมาย ทั้งสองขั้นตอนมีเหตุผลและฉันคิดว่าไม่ถูกต้องมากขึ้น ฉันชอบที่ขั้นตอน "โดยประมาณ" มีสูตรที่ง่ายกว่า นอกจากนี้ฉันยังจำได้ว่าฉันมีชุดข้อมูลบางส่วนที่ขั้นตอน "โดยประมาณ" ให้ผลลัพธ์ที่ดูมีความหมายมากขึ้น น่าเสียดายที่ฉันจำรายละเอียดไม่ได้อีกแล้ว
ตัวอย่าง
นี่คือวิธีการเปรียบเทียบวิธีเหล่านี้สำหรับสองชุดข้อมูลที่รู้จักกันดี: ชุดข้อมูล Iris และชุดข้อมูลไวน์ โปรดทราบว่าวิธีการที่ไร้เดียงสาจะสร้างเส้นโค้งที่ลดลงแบบ monotonically ในขณะที่อีกสองวิธีให้ผลลัพธ์เป็นเส้นโค้งที่มีค่าต่ำสุด โปรดทราบว่าในกรณีของไอริสวิธีการประมาณแนะนำพีซี 1 เครื่องเป็นหมายเลขที่เหมาะสมที่สุด แต่วิธีการ pseudoinverse แนะนำพีซี 2 เครื่อง (และเมื่อมองไปที่ชุด PCA ใด ๆ สำหรับชุดข้อมูล Iris ดูเหมือนว่าทั้งพีซีเครื่องแรกจะมีสัญญาณบ้าง) และในกรณีไวน์วิธีการ pseudoinverse นั้นชี้ให้เห็นอย่างชัดเจนในพีซี 3 เครื่องในขณะที่วิธีการประมาณไม่สามารถตัดสินใจได้ระหว่าง 3 และ 5
รหัส Matlab เพื่อดำเนินการตรวจสอบข้ามและพล็อตผลลัพธ์
function pca_loocv(X)
%// loop over data points
for n=1:size(X,1)
Xtrain = X([1:n-1 n+1:end],:);
mu = mean(Xtrain);
Xtrain = bsxfun(@minus, Xtrain, mu);
[~,~,V] = svd(Xtrain, 'econ');
Xtest = X(n,:);
Xtest = bsxfun(@minus, Xtest, mu);
%// loop over the number of PCs
for j=1:min(size(V,2),25)
P = V(:,1:j)*V(:,1:j)'; %//'
err1 = Xtest * (eye(size(P)) - P);
err2 = Xtest * (eye(size(P)) - P + diag(diag(P)));
for k=1:size(Xtest,2)
proj = Xtest(:,[1:k-1 k+1:end])*pinv(V([1:k-1 k+1:end],1:j))'*V(:,1:j)';
err3(k) = Xtest(k) - proj(k);
end
error1(n,j) = sum(err1(:).^2);
error2(n,j) = sum(err2(:).^2);
error3(n,j) = sum(err3(:).^2);
end
end
error1 = sum(error1);
error2 = sum(error2);
error3 = sum(error3);
%// plotting code
figure
hold on
plot(error1, 'k.--')
plot(error2, 'r.-')
plot(error3, 'b.-')
legend({'Naive method', 'Approximate method', 'Pseudoinverse method'}, ...
'Location', 'NorthWest')
legend boxoff
set(gca, 'XTick', 1:length(error1))
set(gca, 'YTick', [])
xlabel('Number of PCs')
ylabel('Cross-validation error')
tempRepmat(kk,kk) = -1
บรรทัดคืออะไร บรรทัดก่อนหน้านี้ไม่แน่ใจแล้วหรือว่าtempRepmat(kk,kk)
เท่ากับ -1 หรือไม่ นอกจากนี้ทำไม minuses? ข้อผิดพลาดกำลังจะถูกยกกำลังสองอยู่แล้วดังนั้นฉันจะเข้าใจอย่างถูกต้องว่าถ้าเอา minuses ออกจะไม่มีอะไรเปลี่ยนแปลง?