จำลองการดึงจากการกระจายแบบสม่ำเสมอโดยใช้การดึงจากการแจกแจงแบบปกติ


15

ฉันเพิ่งซื้อแหล่งข้อมูลการสัมภาษณ์ด้านวิทยาศาสตร์ข้อมูลซึ่งมีหนึ่งในคำถามที่น่าจะเป็นดังนี้:

ที่ได้รับมาจากการแจกแจงปกติพร้อมพารามิเตอร์ที่รู้จักกันคุณจะจำลองการดึงจากการแจกแจงแบบสม่ำเสมอได้อย่างไร?

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

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

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

มีความคิดเกี่ยวกับวิธีที่ฉันอาจเข้าหาคำถามนี้หรือไม่?

คำตอบ:


30

ในจิตวิญญาณของการใช้การคำนวณเชิงพีชคณิตแบบง่าย ๆซึ่งไม่เกี่ยวข้องกับการคำนวณการแจกแจงแบบปกติฉันจะโน้มตัวไปหาสิ่งต่อไปนี้ พวกเขาได้รับคำสั่งตามที่ฉันคิดไว้ (และจำเป็นต้องมีความคิดสร้างสรรค์มากขึ้น) แต่ฉันได้บันทึกสิ่งที่ดีที่สุด - และน่าประหลาดใจที่สุด - ไว้ได้นาน

  1. ย้อนกลับเทคนิค Box-Mueller : จากแต่ละคู่ของ normals , เครื่องแบบอิสระสองชุดสามารถสร้างได้เป็นatan2 ( Y , X ) (ในช่วง[ - π , π ] ) และexp ( - ( X 2 + Y 2 ) / 2 ) (ตามช่วงเวลา[ 0 , 1 ] )(X,Y)atan2(Y,X)[π,π]exp((X2+Y2)/2)[0,1]

  2. รับภาวะปกติในกลุ่มของสองคนและสรุปสี่เหลี่ยมของพวกเขาที่จะได้รับลำดับของ variates Y 1 , Y 2 , ... , Y ฉัน , ... การแสดงออกที่ได้รับจากคู่χ22Y1,Y2,,Yi,

    Xi=Y2iY2i1+Y2i

    จะมีการแจกแจงแบบซึ่งเป็นรูปแบบเดียวกันBeta(1,1)

    ว่าสิ่งนี้ต้องการเพียงแค่เลขคณิตพื้นฐานอย่างง่ายเท่านั้นที่ควรมีความชัดเจน

  3. เนื่องจากการกระจายที่แน่นอนของสัมประสิทธิ์สหสัมพันธ์แบบเพียร์สันของตัวอย่างสี่คู่จากค่ามาตรฐาน bivariate การแจกแจงแบบปกติมีการกระจายอย่างสม่ำเสมอบนเราอาจใช้ค่าปกติเป็นกลุ่มสี่คู่ (นั่นคือแปดค่าใน แต่ละชุด) และคืนค่าสัมประสิทธิ์สหสัมพันธ์ของคู่เหล่านี้ (สิ่งนี้เกี่ยวข้องกับการคำนวณอย่างง่ายบวกกับการดำเนินการที่สองของรูท)[1,1]

  4. มันได้รับการรู้จักกันมาตั้งแต่สมัยโบราณที่ฉายรูปทรงกระบอกของทรงกลม (พื้นผิวในสามพื้นที่) เป็นพื้นที่ที่เท่าเทียมกัน นี่ก็หมายความว่าในการประมาณการของการกระจายเครื่องแบบบนทรงกลมทั้งพิกัดแนวนอน (สอดคล้องกับลองจิจูด) และพิกัดแนวตั้ง (ตรงกับละติจูด) จะมีการกระจายเครื่องแบบ เนื่องจากมาตรฐาน trivariate การแจกแจงแบบปกตินั้นมีความสมมาตรเป็นทรงกลม การรับลองจิจูดเป็นการคำนวณแบบเดียวกับมุมในวิธี Box-Mueller ( qv ) แต่ละติจูดที่คาดการณ์นั้นใหม่ การฉายบนทรงกลมจะทำให้พิกัดเป็นสามเท่าและ ณ จุดนั้น zคือละติจูดที่คาดการณ์ ดังนั้นให้ใช้ชุดรูปแบบปกติในกลุ่มของสาม, X 3 i - 2 , X 3 i - 1 , X 3 i , และคำนวณ(x,y,z)zX3i2,X3i1,X3i

    X3iX3i22+X3i12+X3i2

    สำหรับ .i=1,2,3,

  5. เนื่องจากระบบคอมพิวเตอร์ส่วนใหญ่เป็นตัวแทนของตัวเลขในระบบเลขฐานสองการสร้างหมายเลขชุดมักจะเริ่มต้นด้วยการผลิตจำนวนเต็มกระจายอย่างสม่ำเสมอระหว่างและ2 32 - 1 (หรือบางพลังงานสูง2ที่เกี่ยวข้องกับความยาวของคำคอมพิวเตอร์) และ rescaling พวกเขาตามต้องการ จำนวนเต็มเช่นนี้แสดงอยู่ภายในว่าเป็นสตริงของเลขฐานสอง32ตัว เราสามารถรับบิตสุ่มอิสระโดยการเปรียบเทียบตัวแปรปกติกับค่ามัธยฐานของมัน ดังนั้นจึงพอเพียงที่จะแบ่งตัวแปร Normal ออกเป็นกลุ่มขนาดเท่ากับจำนวนบิตที่ต้องการเปรียบเทียบแต่ละอันกับค่าเฉลี่ยและรวบรวมลำดับผลลัพธ์ของผลลัพธ์ที่ได้จริง / เท็จเป็นเลขฐานสอง เขียนk02321232kสำหรับจำนวนบิตและสำหรับเครื่องหมาย (นั่นคือH ( x ) = 1เมื่อx > 0และH ( x ) = 0 เป็นอย่างอื่น) เราสามารถแสดงค่าเครื่องแบบปกติที่ได้ผลลัพธ์ใน[ 0 , 1 )ด้วยสูตรHH(x)=1x>0H(x)=0[0,1)

    j=0k1H(Xkij)2j1.

    ตัวแปรสามารถดึงได้จากการแจกแจงแบบต่อเนื่องที่มีค่ามัธยฐานเป็น0 (เช่น Normal Standard) พวกเขาจะถูกประมวลผลในกลุ่มของkกับแต่ละกลุ่มผลิตหนึ่งค่าเหมือนกันหลอกXn0k

  6. การสุ่มตัวอย่างการปฏิเสธเป็นวิธีมาตรฐานที่มีความยืดหยุ่นและมีประสิทธิภาพในการวาดรูปแบบสุ่มจากการแจกแจงโดยพลการ สมมติว่าการกระจายเป้าหมายมี PDF ฉค่าจะถูกวาดขึ้นตามอีกการกระจายกับรูปแบบไฟล์ PDF กรัม ในขั้นตอนการปฏิเสธค่าเครื่องแบบU ที่อยู่ระหว่าง0และg ( Y )จะถูกวาดอย่างอิสระจากYและเมื่อเทียบกับf ( Y ) : ถ้ามันมีขนาดเล็กกว่าYYก.ยู0ก.(Y)Y(Y)Yจะถูกเก็บไว้ แต่กระบวนการจะทำซ้ำ วิธีนี้ดูเหมือนจะเป็นวงกลม แต่เราจะสร้างชุดคำสั่งแบบแปรผันได้ด้วยกระบวนการที่ต้องการชุดคำสั่งแบบชุดเริ่มต้นได้อย่างไร

    คำตอบคือเราไม่จำเป็นต้องมีชุดคำสั่งที่เหมือนกันเพื่อดำเนินขั้นตอนการปฏิเสธ แต่ (สมมติว่า ) เราสามารถพลิกเหรียญที่ยุติธรรมเพื่อให้ได้0หรือ1แบบสุ่ม นี้จะถูกตีความว่าเป็นบิตแรกในฐานเป็นตัวแทนของเครื่องแบบตัวแปรUในช่วง[ 0 , 1 ) เมื่อผลเป็น0หมายถึงการที่0 U < 1 / 2 ; มิฉะนั้น1 / 2 U < 1 ก.(Y)001ยู[0,1)00ยู<1/21/2ยู<1ครึ่งหนึ่งของเวลานี้ก็เพียงพอที่จะตัดสินใจขั้นตอนการปฏิเสธ:ถ้าแต่เหรียญเป็น0 , Yควรจะได้รับการยอมรับ ถ้า( Y ) /กรัม( Y ) < 1 / 2แต่เหรียญคือ1 , Yควรจะปฏิเสธ; มิฉะนั้นเราต้องพลิกเหรียญอีกครั้งเพื่อให้ได้บิตถัดไปของU เพราะ - ไม่ว่าค่าf ใด( Y)(Y)/ก.(Y)1/20Y(Y)/ก.(Y)<1/21Yยูมี - มี 1 / 2โอกาสของการหยุดหลังจากที่แต่ละพลิกจำนวนที่คาดหวังของการพลิกเป็นเพียง 1 / 2 ( 1 ) + 1 / 4 ( 2 ) + 1 / 8 ( 3 ) + + 2 - n ( n ) + = 2(Y)/ก.(Y)1/21/2(1)+1/4(2)+1/8(3)++2n(n)+=2

    การสุ่มตัวอย่างการปฏิเสธสามารถคุ้มค่า (และมีประสิทธิภาพ) หากจำนวนการปฏิเสธที่คาดไว้มีน้อย เราสามารถทำสิ่งนี้ได้โดยปรับสี่เหลี่ยมผืนผ้าที่ใหญ่ที่สุดที่เป็นไปได้ (แทนการกระจายตัวแบบสม่ำเสมอ) ใต้ PDF ปกติ

    PDF ปกติและสม่ำเสมอ

    การใช้แคลคูลัสเพื่อเพิ่มประสิทธิภาพพื้นที่สี่เหลี่ยมที่คุณจะพบว่าจุดสิ้นสุดของมันควรจะนอนอยู่ที่ที่ความสูงเท่ากับประสบการณ์( - 1 / 2 ) / ±1ทำให้พื้นที่มากขึ้นน้อยกว่า0.48 ด้วยการใช้ความหนาแน่นปกติมาตรฐานนี้เป็นgและปฏิเสธค่าทั้งหมดที่อยู่นอกช่วงเวลา[-1,1]โดยอัตโนมัติและมิฉะนั้นจะใช้ขั้นตอนการปฏิเสธเราจะได้รูปแบบเดียวกันใน[-1,1] ได้อย่างมีประสิทธิภาพ:exp(1/2)/2π0.2419710.48g[1,1][1,1]

    • ในส่วนที่ของเวลาตัวแปรปกติอยู่เหนือ[ - 1 , 1 ]และถูกปฏิเสธทันที ( Φเป็น CDF ปกติมาตรฐาน)2Φ(1)0.317[-1,1]Φ

    • ในส่วนที่เหลือของเวลาจะต้องปฏิบัติตามขั้นตอนการปฏิเสธไบนารีโดยต้องมีค่าความแปรปรวนอีกสองค่าโดยเฉลี่ย

    • ขั้นตอนโดยรวมต้องใช้ค่าเฉลี่ยของขั้นตอน1/(2ประสบการณ์(-1/2)/2π)2.07

    จำนวนที่คาดหวังของความแปรปรวนปกติที่จำเป็นในการสร้างผลลัพธ์ที่เหมือนกันนั้น

    2อีπ(1-2Φ(-1))2.82137

    แม้ว่ามันจะค่อนข้างมีประสิทธิภาพ แต่โปรดทราบว่าการคำนวณ (1) ของ PDF ปกติต้องใช้การคำนวณแบบเอ็กซ์โพเนนเชียลและ (2) ค่าจะต้องถูกคำนวณล่วงหน้าทุกครั้ง มันยังคงมีการคำนวณน้อยกว่าวิธี Box-Mueller ( qv )Φ(-1)

  7. สถิติการสั่งซื้อของเครื่องแบบกระจายมีช่องว่างชี้แจง เนื่องจากผลรวมของกำลังสองของสองบรรทัดฐาน (จากค่าเฉลี่ยศูนย์) เป็นเลขชี้กำลังเราอาจสร้างการรับรู้ของเครื่องแบบอิสระโดยการรวมกำลังสองของคู่ของ Normals ดังกล่าวคำนวณผลรวมสะสมของสิ่งเหล่านี้[ 0 , 1 ]และวางอันสุดท้าย (ซึ่งจะเท่ากับ1เสมอ) นี่เป็นวิธีการที่น่าพอใจเพราะมันต้องการเพียงการแบ่งกำลังสองการหาผลรวมและ (ในตอนท้าย) เพียงส่วนเดียวn[0,1]1

    ค่าโดยอัตโนมัติจะอยู่ในลำดับจากน้อยไปมาก หากต้องการการเรียงลำดับเช่นนี้วิธีนี้จะดีกว่าการคำนวณอื่น ๆ ทั้งหมดตราบเท่าที่จะหลีกเลี่ยงค่าใช้จ่ายในการเรียงลำดับO ( n log ( n ) ) หากต้องการลำดับชุดเครื่องแบบอิสระอย่างไรก็ตามการเรียงลำดับค่าnเหล่านี้แบบสุ่มจะเป็นการหลอกลวง เนื่องจาก (เท่าที่เห็นในวิธี Box-Mueller, qv ) อัตราส่วนของแต่ละคู่ของ Normals ไม่ขึ้นอยู่กับผลรวมของกำลังสองของแต่ละคู่เรามีวิธีการที่จะได้รับการเปลี่ยนแปลงแบบสุ่ม: เรียงลำดับผลรวมสะสมโดยอัตราส่วนที่สอดคล้องกัน . (ถ้าnnO(nlog(n))nnมีขนาดใหญ่มากกระบวนการนี้สามารถดำเนินการในกลุ่มเล็ก ๆ ของมีการสูญเสียประสิทธิภาพน้อยเนื่องจากแต่ละกลุ่มต้องการเพียง2 ( k + 1 )เกณฑ์ปกติเพื่อสร้างค่าเครื่องแบบk สำหรับค่าคงที่kค่าใช้จ่ายในการคำนวณแบบซีมโทติคคือO ( n log ( k ) ) = O ( n )ต้องการ2 n ( 1 + 1 / k )ตัวแปรปกติเพื่อสร้างค่าเครื่องแบบn )k2(k+1)kkO(nlog(k))O(n)2n(1+1/k)n

  8. สำหรับการประมาณค่าที่ยอดเยี่ยมตัวแปรปกติใด ๆ ที่มีค่าเบี่ยงเบนมาตรฐานขนาดใหญ่จะมีลักษณะสม่ำเสมอตลอดช่วงของค่าที่น้อยกว่ามาก เมื่อหมุนการกระจายตัวนี้ไปยังช่วง (โดยการเอาเฉพาะส่วนที่เป็นเศษส่วนของค่า) เราจึงได้การแจกแจงที่สม่ำเสมอสำหรับทุกวัตถุประสงค์ สิ่งนี้มีประสิทธิภาพอย่างมากโดยต้องการหนึ่งในการดำเนินการทางคณิตศาสตร์ที่ง่ายที่สุดของทั้งหมด: เพียงแค่ปัดแต่ละตัวแปรปกติลงไปเป็นจำนวนเต็มที่ใกล้ที่สุดและเก็บส่วนเกินไว้ ความเรียบง่ายของวิธีการนี้กลายเป็นสิ่งที่น่าสนใจเมื่อเราตรวจสอบการใช้งานจริง:[0,1]R

    rnorm(n, sd=10) %% 1
    

    สร้างnค่าที่สม่ำเสมอในช่วงที่ราคาของตัวแปรธรรมดาและแทบไม่มีการคำนวณ[0,1]n

    (แม้ว่าค่าเบี่ยงเบนมาตรฐานคือ , PDF ของการประมาณนี้แตกต่างจาก PDF ที่เหมือนกันดังที่แสดงในรูปต่อไปนี้โดยน้อยกว่าหนึ่งส่วนใน10 8 ! ในการตรวจสอบว่าเชื่อถือได้จะต้องมีตัวอย่าง10 ค่า16 - มันเกินความสามารถของการทดสอบแบบสุ่มใด ๆ แล้วด้วยความเบี่ยงเบนมาตรฐานที่ใหญ่กว่าทำให้ความไม่สม่ำเสมอนั้นเล็กมากจนไม่สามารถคำนวณได้ตัวอย่างเช่นด้วย SD 10ที่แสดงในรหัสค่าเบี่ยงเบนสูงสุดจากเครื่องแบบ PDF เพียง10 - 857 )110810161010857

    PDF โดยประมาณ


ในทุกกรณีตัวแปรปกติ "ที่มีพารามิเตอร์ที่รู้จัก" สามารถนำมาปรับใหม่และลดขนาดลงใน Standard Normals ที่สมมติไว้ด้านบนได้อย่างง่ายดาย หลังจากนั้นค่าการกระจายที่เกิดขึ้นอย่างสม่ำเสมอสามารถปรับใหม่อีกครั้งและลดขนาดให้ครอบคลุมช่วงเวลาที่ต้องการ สิ่งเหล่านี้ต้องการการดำเนินการทางคณิตศาสตร์ขั้นพื้นฐานเท่านั้น

ความง่ายของการสร้างเหล่านี้ถูกพิสูจน์ด้วยRรหัสต่อไปนี้ซึ่งใช้เพียงหนึ่งหรือสองบรรทัดสำหรับส่วนใหญ่ ความถูกต้องของพวกเขาคือพยานที่เกิดใกล้เครื่องแบบ histograms ขึ้นอยู่กับค่าอิสระในแต่ละกรณี (ต้องประมาณ 12 วินาทีสำหรับทุกเจ็ดจำลอง) สำหรับการอ้างอิง - ในกรณีที่คุณมีความกังวลเกี่ยวกับจำนวนของการเปลี่ยนแปลงที่ปรากฏในแปลงใด ๆ เหล่านี้ - ฮิสโตแกรมของค่าเครื่องแบบที่จำลองด้วยเครื่องกำเนิดเลขสุ่มของเครื่องแบบรวมอยู่ในตอนท้าย100,000R

histograms

แบบจำลองเหล่านี้ทั้งหมดได้รับการทดสอบเพื่อความสม่ำเสมอโดยใช้χ2ทดสอบจากถังขยะ ไม่มีการพิจารณาอย่างมีนัยสำคัญที่ไม่สม่ำเสมอ (ค่า p ต่ำสุดคือ3 % - สำหรับผลลัพธ์ที่สร้างขึ้นโดยเครื่องกำเนิดตัวเลขที่เหมือนกันจริง!)10003%R

set.seed(17)
n <- 1e5
y <- matrix(rnorm(floor(n/2)*2), nrow=2)
x <- c(atan2(y[2,], y[1,])/(2*pi) + 1/2, exp(-(y[1,]^2+y[2,]^2)/2))
hist(x, main="Box-Mueller")

y <- apply(array(rnorm(4*n), c(2,2,n)), c(3,2), function(z) sum(z^2))
x <- y[,2] / (y[,1]+y[,2])
hist(x, main="Beta")

x <- apply(array(rnorm(8*n), c(4,2,n)), 3, function(y) cor(y[,1], y[,2]))
hist(x, main="Correlation")

n.bits <- 32; x <-  (2^-(1:n.bits)) %*% matrix(rnorm(n*n.bits) > 0, n.bits)
hist(x, main="Binary")

y <- matrix(rnorm(n*3), 3)
x <- y[1, ] / sqrt(apply(y, 2, function(x) sum(x^2)))
hist(x, main="Equal area")

accept <- function(p) { # Using random normals, return TRUE with chance `p`
  p.bit <- x <- 0
  while(p.bit == x) {
    p.bit <- p >= 1/2
    x <- rnorm(1) >= 0
    p <- (2*p) %% 1
  }
  return(x == 0)
}
y <- rnorm(ceiling(n * sqrt(exp(1)*pi/2))) # This aims to produce `n` uniforms
y <- y[abs(y) < 1]
x <- y[sapply(y, function(x) accept(exp((x^2-1)/2)))]
hist(x, main="Rejection")

y <- matrix(rnorm(2*(n+1))^2, 2)
x <- cumsum(y)[seq(2, 2*(n+1), 2)]
x <- x[-(n+1)] / x[n+1]
x <- x[order(y[2,-(n+1)]/y[1,-(n+1)])] 
hist(x, main="Ordered")

x <- rnorm(n) %% 1 # (Use SD of 5 or greater in practice)
hist(x, main="Modular")

x <- runif(n)      # Reference distribution
hist(x, main="Uniform")

2
Z=(X1X2)/(X3X4)X

1
โดยทั่วไปหลักการคือการหาปริมาณการพิจาณาจากตัวอย่างที่มี cdf คล้อยตามคอมพิวเตอร์ สิ่งนี้เชื่อมโยงอย่างดีกับการสร้างช่วงความมั่นใจและการทดสอบสมมติฐานด้วยการบิดที่เราอาจพยายามหาจำนวนองค์ประกอบที่ใช้ให้เหมาะสมที่สุดแทนที่จะเป็นกรณีหลังซึ่งมุ่งเน้นไปที่การเพิ่มข้อมูลจากขนาดตัวอย่างที่แน่นอน
พระคาร์ดินัล

@ Cardinal ขอบคุณสำหรับความคิดเห็นที่น่าสนใจรวมถึงวิธีที่เก้า (Cauchy) แม้แต่การค้นหาปริมาณการพิจาณาก็ไม่จำเป็นเมื่อค้นหาเพียงการประมาณที่ดี ตัวอย่างเช่น (8) ทำงานได้อย่างสมบูรณ์แบบหากคุณจองผลลัพธ์เบื้องต้นจำนวนเล็กน้อยเพื่อสร้างสเกลคร่าวๆ
whuber

8

XN(μ,σ2)Φμ,σ2Φμ,σ2(X)(0,1)d(0,1)

P(Φμ,σ2(X)d)=P(XΦμ,σ21(d))=d

d1d1Φμ,σ2(X)(0,1)σR Rดังนั้นคุณสามารถเปลี่ยนรูปแบบการกระจายข้อมูลตามปกติโดยฟังก์ชั่นการกระจายและคุณจะได้รับข้อมูลที่กระจายอย่างสม่ำเสมอ


4
มันเป็นสิ่งที่ตรงกันข้ามของการสุ่มตัวอย่างการแปลงผกผัน!
Roger Fan

คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับประโยคที่สองของย่อหน้าที่สองของคุณได้หรือไม่? ฉันมีปัญหาในการทำความเข้าใจต่อไปนี้: "นี่เพียงพอที่จะแสดงให้เห็นว่าΦμ, σ2 (X) มีการแจกแจงแบบสม่ำเสมอใน (0,1) ตามที่เราได้แสดงให้เห็นว่ามาตรการที่สอดคล้องกันนั้นมีค่าเท่ากันสำหรับเครื่องกำเนิดของพีชคณิต ในℝ. "
เวลลิงตัน

XX(P)σ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.