วางแผนการแจกแจงแบบเกาส์ในรูปแบบ 3 มิติ


10

ในทฤษฎีความน่าจะเป็นการแจกแจงแบบปกติ (หรือเกาส์เซียน)เป็นการกระจายความน่าจะเป็นแบบต่อเนื่องที่พบบ่อยมาก การแจกแจงแบบปกติมีความสำคัญในสถิติและมักใช้ในวิทยาศาสตร์ธรรมชาติและสังคมเพื่อเป็นตัวแทนของตัวแปรสุ่มที่มีมูลค่าจริงซึ่งไม่ทราบการแจกแจง

ความท้าทาย

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

ที่ไหน:




A = 1, σ x = σ y = σ

กฎระเบียบ

  • โปรแกรมของคุณต้องรับหนึ่งอินพุทσซึ่งเป็นค่าเบี่ยงเบนมาตรฐาน
  • โปรแกรมของคุณต้องพิมพ์พล็อตเรื่องการกระจายแบบเกาส์ 3 มิติด้วยคุณภาพสูงสุดตามที่ภาษา / ระบบของคุณอนุญาต
  • โปรแกรมของคุณไม่สามารถใช้การกระจายแบบเกาส์เซียนโดยตรงหรือสร้างความหนาแน่นของความน่าจะเป็น
  • โปรแกรมของคุณไม่จำเป็นต้องยกเลิก
  • พล็อตของคุณอาจเป็นขาวดำหรือสี
  • พล็อตของคุณจะต้องมีเส้นกริดที่ด้านล่าง เส้นกริดที่ด้านข้าง (ดังแสดงในตัวอย่าง) ไม่จำเป็น
  • พล็อตของคุณไม่จำเป็นต้องมีหมายเลขบรรทัดถัดจากเส้นกริด

เกณฑ์การให้คะแนน

ตามปกติในการส่งที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ! ฉันอาจไม่ "ยอมรับ" คำตอบโดยใช้ปุ่มยกเว้นว่ามีคำตอบเล็ก ๆ น้อย ๆ และใช้งานง่าย

ตัวอย่างผลลัพธ์

ผลลัพธ์ของคุณอาจมีลักษณะเช่นนี้:

5

หรืออาจมีลักษณะเช่นนี้:

6

อื่น ๆ ที่ถูกต้อง เอาท์พุท ไม่ถูกต้อง เอาท์พุท


ฉันสับสนว่าคุณเพิ่งแสดงฟังก์ชั่นสำหรับแกน X เราจำเป็นต้องใช้อินพุต / เอาต์พุตแยกต่างหากสำหรับ X และ Y sigma และ mu หรือไม่
Scott Milner

เราจะสมมติว่าμเท่ากับ 0 ได้ไหม และคุณต้องการขนาดเท่าไรสำหรับ x และ y ถ้าช่วง x และ y- เลือกน้อยมากเมื่อเทียบกับσกราฟนั้นจะมีลักษณะเหมือนฟังก์ชันคงที่
Greg Martin

(สำหรับการกระจายแบบสองมิติฉันคิดว่ามันชัดเจนกว่าถ้าคุณใช้ | x-μ | ^ 2 ในคำจำกัดความมากกว่า (x-μ) ^ 2.)
Greg Martin

@GregMartin แก้ไขแล้ว
MD XF

2
ยังไม่ชัดเจน ... x_o และ y_o และθคืออะไร?
Greg Martin

คำตอบ:


7

Gnuplot 4, 64 62 61 60 47 ไบต์

(ผูกกับMathematica ! WooHoo!)

se t pn;se is 80;sp exp(-(x**2+y**2)/(2*$0**2))

บันทึกรหัสข้างต้นลงในไฟล์ที่มีชื่อA.gpและเรียกใช้ดังต่อไปนี้:

gnuplot -e 'call "A.gp" $1'>GnuPlot3D.png

ที่จะถูกแทนที่ด้วยค่าของ$1 σสิ่งนี้จะบันทึก.pngไฟล์GnuPlot3D.pngที่มีชื่อซึ่งมีเอาต์พุตที่ต้องการลงในไดเรกทอรีการทำงานปัจจุบัน

หมายเหตุว่านี้เท่านั้นทำงานร่วมกับการกระจายของ Gnuplot 4 เนื่องจากใน Gnuplot 5 อ้างอิงถึงข้อโต้แย้งที่ถูกเลิกใช้แล้วและแทนที่ด้วยโชคร้ายมากขึ้นอย่างละเอียด$nARGn

ตัวอย่างผลลัพธ์ด้วยσ = 3:

ตัวอย่างผลลัพธ์

ผลลัพธ์นี้จะปรับตามOP


Gnuplot 4 โซลูชันสำรอง 60 ไบต์

นี่คือทางออกอื่นซึ่งยาวกว่าโซลูชันก่อนหน้ามาก แต่ผลลัพธ์จะดูดีกว่ามากในความคิดของฉัน

se t pn;se is 80;se xyp 0;sp exp(-(x**2+y**2)/(2*$0**2))w pm

สิ่งนี้ยังคงต้องการ Gnuplot 4 ด้วยเหตุผลเดียวกับโซลูชันก่อนหน้า

ตัวอย่างผลลัพธ์ด้วยσ = 3:

ตัวอย่างผลลัพธ์ # 2


I am not sure if it molds to the specifications requiredคุณสมบัติอะไรที่คุณคิดว่ามันไม่เป็นไปตาม?
MD XF

@MDXF ประการแรกฉันไม่แน่ใจว่าความโปร่งใสของกราฟนั้นโอเคหรือเปล่า ฉันไม่ชอบมันจริงๆซึ่งก็เป็นเหตุผลว่าทำไมฉันถึงไม่แน่ใจว่ามันจะโอเคไหม ประการที่สองกราฟเริ่มต้นหนึ่งหน่วยสูงจากด้านล่างโดยค่าเริ่มต้นและฉันไม่แน่ใจว่าเป็นสิ่งที่ถูกต้องอย่างใดอย่างหนึ่ง ประการที่สามเนื่องจากกราฟเริ่มต้นสูงหนึ่งหน่วยฉันไม่แน่ใจว่ากราฟที่ไม่ได้สัดส่วนเมื่อเปรียบเทียบกับกราฟที่ให้ไว้ในโพสต์ต้นฉบับนั้นถูกต้อง อย่างไรก็ตามถ้าทั้งหมดนี้โอเคกับคุณฉันจะทำให้มันเป็นคำตอบหลักอย่างมีความสุข
R. Kap

@MDXF ที่จริงแล้วฉันจะโพสต์เป็นคำตอบเดิม แต่ด้วยเหตุผลเหล่านี้ฉันเลือกที่จะไม่โพสต์และตอบกลับด้วยคำตอบปัจจุบันแทน
R. Kap

@MDXF ที่จริงแล้วฉันสามารถทำให้สั้นกว่านี้ได้ถ้ามันโอเค ฉันเข้าใจว่ามันจะไม่เป็นจริง แต่ก็ไม่เจ็บถาม มันเป็นวิธีเริ่มต้นที่Gnuplotจะพล็อตความหนาแน่นของความน่าจะเป็นของการแจกแจงแบบเกาส์ด้วยซิกมาซึ่ง2ไม่มีการดัดแปลงสภาพแวดล้อมใด ๆ
R. Kap

@ MDXF ฉันเดาว่าฉันจะถามก่อนโพสต์คำตอบเดิมของฉัน แต่ในขณะที่ฉันกระตือรือร้นที่จะโพสต์คำตอบ
R. Kap

14

C ++ 3477 3344 ไบต์

จำนวนไบต์ไม่รวมบรรทัดใหม่ที่ไม่จำเป็น
MD XF เริ่มต้นที่ 133 ไบต์

ไม่มีทางที่ C ++ จะสามารถแข่งขันในเรื่องนี้ได้ แต่ฉันคิดว่ามันคงจะสนุกถ้าได้เขียนนักแสดงซอฟต์แวร์สำหรับความท้าทาย ฉันฉีกและเล่นกอล์ฟGLMสำหรับคณิตศาสตร์สามมิติและใช้อัลกอริทึมไลน์ของ Xiaolin Wuสำหรับการแรสเตอร์ โปรแกรมจะแสดงผลไปยังแฟ้ม PGM gชื่อ

เอาท์พุต

#include<array>
#include<cmath>
#include<vector>
#include<string>
#include<fstream>
#include<algorithm>
#include<functional>
#define L for
#define A auto
#define E swap
#define F float
#define U using
U namespace std;
#define K vector
#define N <<"\n"
#define Z size_t
#define R return
#define B uint8_t
#define I uint32_t
#define P operator
#define W(V)<<V<<' '
#define Y template<Z C>
#define G(O)Y vc<C>P O(vc<C>v,F s){vc<C>o;L(Z i=0;i<C;++i){o\
[i]=v[i]O s;}R o;}Y vc<C>P O(vc<C>l, vc<C>r){vc<C>o;L(Z i=0;i<C;++i){o[i]=l[i]O r[i];}R o;}
Y U vc=array<F,C>;U v2=vc<2>;U v3=vc<3>;U v4=vc<4>;U m4=array<v4,4>;G(+)G(-)G(*)G(/)Y F d(
vc<C>a,vc<C>b){F o=0;L(Z i=0;i<C;++i){o+=a[i]*b[i];}R o;}Y vc<C>n(vc<C>v){R v/sqrt(d(v,v));
}v3 cr(v3 a,v3 b){R v3{a[1]*b[2]-b[1]*a[2],a[2]*b[0]-b[2]*a[0],a[0]*b[1]-b[0]*a[1]};}m4 P*(
m4 l,m4 r){R{l[0]*r[0][0]+l[1]*r[0][1]+l[2]*r[0][2]+l[3]*r[0][3],l[0]*r[1][0]+l[1]*r[1][1]+
l[2]*r[1][2]+l[3]*r[1][3],l[0]*r[2][0]+l[1]*r[2][1]+l[2]*r[2][2]+l[3]*r[2][3],l[0]*r[3][0]+
l[1]*r[3][1]+l[2]*r[3][2]+l[3]*r[3][3]};}v4 P*(m4 m,v4 v){R v4{m[0][0]*v[0]+m[1][0]*v[1]+m[
2][0]*v[2]+m[3][0]*v[3],m[0][1]*v[0]+m[1][1]*v[1]+m[2][1]*v[2]+m[3][1]*v[3],m[0][2]*v[0]+m[
1][2]*v[1]+m[2][2]*v[2]+m[3][2]*v[3],m[0][3]*v[0]+m[1][3]*v[1]+m[2][3]*v[2]+m[3][3]*v[3]};}
m4 at(v3 a,v3 b,v3 c){A f=n(b-a);A s=n(cr(f,c));A u=cr(s,f);A o=m4{1,0,0,0,0,1,0,0,0,0,1,0,
0,0,0,1};o[0][0]=s[0];o[1][0]=s[1];o[2][0]=s[2];o[0][1]=u[0];o[1][1]=u[1];o[2][1]=u[2];o[0]
[2]=-f[0];o[1][2]=-f[1];o[2][2]=-f[2];o[3][0]=-d(s,a);o[3][1]=-d(u,a);o[3][2]=d(f,a);R o;}
m4 pr(F f,F a,F b,F c){F t=tan(f*.5f);m4 o{};o[0][0]=1.f/(t*a);o[1][1]=1.f/t;o[2][3]=-1;o[2
][2]=c/(b-c);o[3][2]=-(c*b)/(c-b);R o;}F lr(F a,F b,F t){R fma(t,b,fma(-t,a,a));}F fp(F f){
R f<0?1-(f-floor(f)):f-floor(f);}F rf(F f){R 1-fp(f);}struct S{I w,h; K<F> f;S(I w,I h):w{w
},h{h},f(w*h){}F&P[](pair<I,I>c){static F z;z=0;Z i=c.first*w+c.second;R i<f.size()?f[i]:z;
}F*b(){R f.data();}Y vc<C>n(vc<C>v){v[0]=lr((F)w*.5f,(F)w,v[0]);v[1]=lr((F)h*.5f,(F)h,-v[1]
);R v;}};I xe(S&f,v2 v,bool s,F g,F c,F*q=0){I p=(I)round(v[0]);A ye=v[1]+g*(p-v[0]);A xd=
rf(v[0]+.5f);A x=p;A y=(I)ye;(s?f[{y,x}]:f[{x,y}])+=(rf(ye)*xd)*c;(s?f[{y+1,x}]:f[{x,y+1}])
+=(fp(ye)*xd)*c;if(q){*q=ye+g;}R x;}K<v4> g(F i,I r,function<v4(F,F)>f){K<v4>g;F p=i*.5f;F
q=1.f/r;L(Z zi=0;zi<r;++zi){F z=lr(-p,p,zi*q);L(Z h=0;h<r;++h){F x=lr(-p,p,h*q);g.push_back
(f(x,z));}}R g;}B xw(S&f,v2 b,v2 e,F c){E(b[0],b[1]);E(e[0],e[1]);A s=abs(e[1]-b[1])>abs
(e[0]-b[0]);if(s){E(b[0],b[1]);E(e[0],e[1]);}if(b[0]>e[0]){E(b[0],e[0]);E(b[1],e[1]);}F yi=
0;A d=e-b;A g=d[0]?d[1]/d[0]:1;A xB=xe(f,b,s,g,c,&yi);A xE=xe(f,e,s,g,c);L(I x=xB+1;x<xE;++
x){(s?f[{(I)yi,x}]:f[{x,(I)yi}])+=rf(yi)*c;(s?f[{(I)yi+1,x}]:f[{x,(I)yi+1}])+=fp(yi)*c;yi+=
g;}}v4 tp(S&s,m4 m,v4 v){v=m*v;R s.n(v/v[3]);}main(){F l=6;Z c=64;A J=g(l,c,[](F x,F z){R
v4{x,exp(-(pow(x,2)+pow(z,2))/(2*pow(0.75f,2))),z,1};});I w=1024;I h=w;S s(w,h);m4 m=pr(
1.0472f,(F)w/(F)h,3.5f,11.4f)*at({4.8f,3,4.8f},{0,0,0},{0,1,0});L(Z j=0;j<c;++j){L(Z i=0;i<
c;++i){Z id=j*c+i;A p=tp(s,m,J[id]);A dp=[&](Z o){A e=tp(s,m,J[id+o]);F v=(p[2]+e[2])*0.5f;
xw(s,{p[0],p[1]},{e[0],e[1]},1.f-v);};if(i<c-1){dp(1);}if(j<c-1){dp(c);}}}K<B> b(w*h);L(Z i
=0;i<b.size();++i){b[i]=(B)round((1-min(max(s.b()[i],0.f),1.f))*255);}ofstream f("g");f 
W("P2")N;f W(w)W(h)N;f W(255)N;L(I y=0;y<h;++y){L(I x=0;x<w;++x)f W((I)b[y*w+x]);f N;}R 0;}
  • l คือความยาวของด้านใดด้านหนึ่งของตารางในอวกาศโลก
  • c คือจำนวนของจุดยอดตามขอบแต่ละตาราง
  • ฟังก์ชั่นที่สร้างกริดนั้นถูกเรียกพร้อมกับฟังก์ชั่นที่รับอินพุตสองตัวxและz(+ y ขึ้นไป) พิกัดอวกาศของจุดยอดและส่งคืนตำแหน่งพื้นที่โลกของจุดยอด
  • w คือความกว้างของ pgm
  • h คือความสูงของ pgm
  • mคือเมทริกซ์มุมมอง / เส้นโครง อาร์กิวเมนต์ที่ใช้ในการสร้างmคือ ...
    • สาขาดูในเรเดียน
    • อัตราส่วนกว้างยาวของ pgm
    • ใกล้ระนาบคลิป
    • เครื่องบินคลิปไกล
    • ตำแหน่งกล้อง
    • เป้าหมายกล้อง
    • เวกเตอร์ขึ้น

โปรแกรมแสดงภาพสามารถมีคุณสมบัติเพิ่มเติมได้ง่ายขึ้นประสิทธิภาพที่ดีขึ้นและสามารถเล่นกอล์ฟได้ดีขึ้น แต่ฉันสนุกแล้ว!


2
ว้าวนั่นช่างเหลือเชื่อ!
MD XF

1
ไม่เลย ... ไปหามัน!
Patrick Purcell

1
ไปแล้ว 133 ไบต์!
MD XF

1
มันยอดเยี่ยมมาก! หากคุณสามารถบอกฉันได้ว่าคุณได้เรียนรู้อะไรทั้งหมดนั้นจะดีมาก !
HatsuPointerKun

1
@HatsuPointerKun ดีใจที่คุณสนุกกับมัน! บทช่วยสอนนี้ ... opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices ... เป็นจุดเริ่มต้นที่ดี
Patrick Purcell

9

Mathematica, 47 ไบต์

Plot3D[E^(-(x^2+y^2)/2/#^2),{x,-6,6},{y,-6,6}]&

ใช้เป็นอินพุตσ

อินพุต

[2]

เอาท์พุต
ป้อนคำอธิบายรูปภาพที่นี่

-2 ไบต์ต้องขอบคุณ LLlAMnYP


1
Mathematica ชนะรางวัลหรือไม่ ไม่มีความประหลาดใจ: P
MD XF

3
ประหยัด 2 ไบต์ด้วยE^(-(x^2+y^2)/2/#^2)
LLlAMnYP

6

R, 105 102 87 86 ไบต์

s=scan();plot3D::persp3D(z=sapply(x<-seq(-6,6,.1),function(y)exp(-(y^2+x^2)/(2*s^2))))

ใช้ Sigma จาก STDIN สร้างเวกเตอร์จาก-6ไป6ในขั้นตอน.1ของทั้งสองxและy, แล้วสร้าง121x121เมทริกซ์โดยการใช้ผลิตภัณฑ์ด้านนอกของและx yสิ่งนี้สั้นกว่าการโทรmatrixและระบุขนาด เมทริกซ์นั้นเต็มไปแล้ว แต่ก็ไม่เป็นไรเพราะเราเขียนทับมัน

forลูป -loop กว่าค่าในxทำให้การใช้งานของการดำเนินงาน vectorized ในRการสร้างหนึ่งแถวหนาแน่นเมทริกซ์ในเวลา

(s)applyอีกครั้งเป็นวิธีที่สั้นลงสำหรับการดำเนินการ vectorized เช่นเดียวกับฮีโร่ที่เป็นมันจัดการการสร้างเมทริกซ์ทั้งหมดด้วยตัวเองบันทึกค่อนข้างน้อยไบต์

ป้อนคำอธิบายรูปภาพที่นี่

128 125 110 109 ไบต์ แต่วิธีแฟนซีเพิ่มเติม:

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

s=scan();plotly::plot_ly(z=sapply(x<-seq(-6,6,.1),function(y)exp(-(y^2+x^2)/(2*s^2))),x=x,y=x,type="surface")

BLA


ฉันระบุในคำถามว่ากราฟไม่จำเป็นต้องมีหมายเลขบรรทัดการส่งที่สองของคุณไม่เป็นไร
MD XF

โอ้ฉันต้องคิดถึงมันแน่ ๆ ฉันสลับโซลูชันของฉันไปรอบ ๆ ฉันคิดว่าplotlyพล็อตนั้นแฟนซีพอที่จะรับประกันว่ายังคงรวมอยู่ที่นี่
JAD

ทั้งคู่ต่างก็มีความเพ้อฝันมากกว่าของฉัน : P
MD XF

เนื่องจากคุณใช้เพียงsครั้งเดียวคุณสามารถทำได้2*scan()^2และลบs=scan();ที่ตอนเริ่มต้นหรือไม่ มันจะประหยัดได้ 3 ไบต์
KSmarts

6

Applesoft BASIC, 930 783 782 727 719 702 695 637 ไบต์

-72 ไบต์และโปรแกรมที่ใช้งานได้ขอบคุณcatcatระบุความผิดพลาดของฉันและอัลกอริธึมที่สั้นลง

0TEXT:HOME:INPUTN:HGR:HCOLOR=3:W=279:H=159:L=W-100:Z=L/10:B=H-100:C=H-60:K=0.5:M=1/(2*3.14159265*N*N):FORI=0TO10STEPK:X=10*I+1:Y=10*I+B:HPLOTX,Y:FORJ=0TOL STEP1:O=10*J/L:D=ABS(5-I):E=ABS(5-O):R=(D*D+E*E)/(2*N*N):G=EXP(-R)*M:A=INT((C*G)/M):X=10*I+Z*O+1:Y=10*I+B-A:HPLOTTOX,Y:IF(I=0)GOTO4
1IF(J=L)GOTO3
2V=INT(J/10):IF((J/10)<>V)GOTO5
3D=ABS(5-I+K):E=ABS(5-O):R=(D*D+E*E)/(2*N*N):U=EXP(-R)/(2*3.14159*N*N):S=INT((C*U)/M):P=10*(I-K)+Z*O+1:Q=10*(I-K)+B-S:HPLOT TOP,Q:HPLOTX,Y
4IF(J=0)GOTO7:IF(I<10)GOTO5:IF(J=L)GOTO6:V=INT(J/10):IF((J/10)=V)GOTO6
5HCOLOR=0
6HPLOTTOX,10*I+B:HCOLOR=3:HPLOTX,Y
7NEXTJ:NEXTI:HPLOTW+1,H:HPLOTTO101,H:HPLOTTO0+1,H

เวอร์ชั่นที่ไม่ดี

เมื่อรับอินพุต1:

การป้อนข้อมูล-1

เมื่อรับอินพุต2:

การป้อนข้อมูล-2


1
นี่แสดงให้เห็นอีกครั้งถึงความเหนือกว่าของ BASIC ....

สามารถบันทึกอีกสองสามไบต์โดยการตั้งค่าตัวแปรหนึ่งตัวหรือมากกว่าเป็นค่าที่ใช้บ่อยเช่น 10 นอกจากนี้ขอแนะนำให้แทนที่EXP(X)/(2*3.14159*S1*S1)ด้วยEXP(X)*M
ceilingcat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.