ฉันพยายามแปลงรหัส matlab เป็น numpy และพบว่า numpy มีผลลัพธ์ที่แตกต่างกับฟังก์ชัน std
ใน matlab
std([1,3,4,6])
ans = 2.0817
เป็นตัวเลข
np.std([1,3,4,6])
1.8027756377319946
เป็นเรื่องปกติหรือไม่? และควรจัดการกับเรื่องนี้อย่างไร?
ฉันพยายามแปลงรหัส matlab เป็น numpy และพบว่า numpy มีผลลัพธ์ที่แตกต่างกับฟังก์ชัน std
ใน matlab
std([1,3,4,6])
ans = 2.0817
เป็นตัวเลข
np.std([1,3,4,6])
1.8027756377319946
เป็นเรื่องปกติหรือไม่? และควรจัดการกับเรื่องนี้อย่างไร?
คำตอบ:
ฟังก์ชัน NumPy np.std
รับพารามิเตอร์ที่เป็นทางเลือกddof
: "Delta Degrees of Freedom" 0
โดยค่าเริ่มต้นนี้เป็น ตั้งค่า1
เพื่อรับผลลัพธ์ MATLAB:
>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326
เพื่อเพิ่มบริบทอีกเล็กน้อยในการคำนวณความแปรปรวน (ซึ่งค่าเบี่ยงเบนมาตรฐานคือรากที่สอง) โดยทั่วไปเราจะหารด้วยจำนวนค่าที่เรามี
แต่ถ้าเราเลือกตัวอย่างแบบสุ่มของN
องค์ประกอบจากการแจกแจงที่มากขึ้นและคำนวณความแปรปรวนการหารด้วยN
อาจทำให้ค่าความแปรปรวนที่แท้จริงต่ำเกินไป ในการแก้ไขปัญหานี้เราสามารถลดจำนวนที่เราหารด้วย ( องศาอิสระ ) ให้เป็นจำนวนที่น้อยกว่าN
(โดยปกติN-1
) ddof
พารามิเตอร์ช่วยให้เราเปลี่ยนหารด้วยจำนวนเงินที่เราระบุ
เว้นแต่จะบอกเป็นอย่างอื่น NumPy จะคำนวณตัวประมาณค่าแบบเอนเอียงสำหรับความแปรปรวน ( ddof=0
หารด้วยN
) นี่คือสิ่งที่คุณต้องการหากคุณกำลังทำงานกับการแจกแจงทั้งหมด (ไม่ใช่ชุดย่อยของค่าที่สุ่มเลือกจากการแจกแจงที่ใหญ่กว่า) หากกำหนดddof
พารามิเตอร์ NumPy จะหารด้วยN - ddof
แทน
พฤติกรรมเริ่มต้นของของ MATLAB คือการแก้ไขอคติสำหรับแปรปรวนกลุ่มตัวอย่างโดยการหารด้วยstd
N-1
สิ่งนี้จะกำจัดอคติบางส่วน (แต่อาจไม่ใช่ทั้งหมด) ในส่วนเบี่ยงเบนมาตรฐาน สิ่งนี้น่าจะเป็นสิ่งที่คุณต้องการหากคุณใช้ฟังก์ชันนี้กับตัวอย่างสุ่มของการแจกแจงขนาดใหญ่
คำตอบที่ดีโดย @hbaderts ให้รายละเอียดทางคณิตศาสตร์เพิ่มเติม
ค่าเบี่ยงเบนมาตรฐานคือรากที่สองของความแปรปรวน ความแปรปรวนของตัวแปรสุ่มX
ถูกกำหนดเป็น
ดังนั้นตัวประมาณค่าสำหรับความแปรปรวนจะเป็น
ที่หมายถึงค่าเฉลี่ยตัวอย่าง สำหรับการเลือกแบบสุ่มสามารถแสดงได้ว่าตัวประมาณนี้ไม่ได้มาบรรจบกับความแปรปรวนจริง แต่เป็น
หากคุณสุ่มเลือกตัวอย่างและประมาณค่าเฉลี่ยและความแปรปรวนของตัวอย่างคุณจะต้องใช้ตัวประมาณค่าที่ถูกต้อง (เป็นกลาง)
ซึ่งจะมาบรรจบกันเพื่อ คำแก้ไขเรียกอีกอย่างว่าการแก้ไขของ Bessel
ในขณะนี้โดยค่าเริ่มต้น MATLABs std
คำนวณเป็นกลางn-1
ประมาณการที่มีระยะเวลาการแก้ไข อย่างไรก็ตาม NumPy (ตามที่ @ajcr อธิบาย) จะคำนวณตัวประมาณค่าแบบเอนเอียงโดยไม่มีเงื่อนไขการแก้ไขตามค่าเริ่มต้น พารามิเตอร์ที่จะช่วยให้การตั้งระยะการแก้ไขใดddof
ๆ n-ddof
เมื่อตั้งค่าเป็น 1 คุณจะได้ผลลัพธ์เช่นเดียวกับใน MATLAB
ในทำนองเดียวกัน MATLAB อนุญาตให้เพิ่มพารามิเตอร์ที่สองw
ซึ่งระบุ "รูปแบบการชั่งน้ำหนัก" ค่าดีฟอลต์w=0
ผลลัพธ์เป็นเงื่อนไขการแก้ไขn-1
(ตัวประมาณที่เป็นกลาง) ในขณะที่สำหรับw=1
n เท่านั้นที่ใช้เป็นเงื่อนไขการแก้ไข (ตัวประมาณค่าเอนเอียง)
n
ไปที่ด้านบนสุดของสัญกรณ์ผลรวมมันกลับเข้าไปในผลรวม
สำหรับคนที่ไม่ค่อยเก่งเรื่องสถิติคำแนะนำง่ายๆคือ:
รวมddof=1
ถ้าคุณกำลังคำนวณnp.std()
สำหรับตัวอย่างที่นำมาจากชุดข้อมูลทั้งหมดของคุณ
ตรวจสอบddof=0
ว่าคุณกำลังคำนวณnp.std()
สำหรับประชากรทั้งหมดหรือไม่
DDOF รวมอยู่ในตัวอย่างเพื่อถ่วงดุลอคติที่อาจเกิดขึ้นในตัวเลข
std([1 3 4 6],1)
NumPynp.std([1,3,4,6])
ทั้งหมดนี้อธิบายไว้ค่อนข้างชัดเจนในเอกสารประกอบสำหรับ Matlab และ NumPy ดังนั้นฉันขอแนะนำอย่างยิ่งให้ OP อย่าลืมอ่านสิ่งเหล่านี้ในอนาคต