บทความนี้อธิบายถึงอัลกอริทึมเครือข่ายประสาทเทียมอย่างง่ายโดยใช้การใช้งาน Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
มาดูไดอะแกรมอัลกอริทึมที่ฉันวาดไว้:
2. หมวดหมู่ข้อมูล
นำเข้า java.util.Arrays; ข้อมูลระดับสาธารณะ {double [] เวกเตอร์; การแบ่ง int; ประเภท int; สาธารณะสองเท่า [] getVector () {return vector; } โมฆะสาธารณะ setVector (double [] เวกเตอร์) {this.vector = เวกเตอร์; } public int getDimention () {Division return; } โมฆะสาธารณะ setDimention (ส่วน int) {this.dimention = Division; } public int getType () {ประเภท return; } โมฆะสาธารณะ setType (ประเภท int) {this.type = type; } ข้อมูลสาธารณะ (double [] เวกเตอร์, int dimentation, ประเภท int) {super (); this.vector = เวกเตอร์; this. dimentation = dimentation; this.type = type; } ข้อมูลสาธารณะ () {} @Override สตริงสาธารณะ toString () {return "data [vector =" + array.toString (เวกเตอร์) + ", Dimension =" + dimentation + ", type =" + "]"; -3. เครือข่ายประสาทเทียมง่ายๆ
แพ็คเกจ cn.edu.hbut.chenjie; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า java.util.random; นำเข้า org.jfree.chart.chartfactory; นำเข้า org.jfree.chart.chartframe; org.jfree.data.xy.defaultxydataset; นำเข้า org.jfree.ui.refineryutilities; ชั้นเรียนสาธารณะ ann2 {private double eta; // อัตราการเรียนรู้ส่วนตัว int n_iter; // น้ำหนักเวกเตอร์ w [] จำนวนครั้งการฝึกอบรม น้ำหนัก; // เวกเตอร์น้ำหนักซึ่งมีความยาวคือมิติข้อมูลการฝึกอบรม +1 ในกรณีนี้ข้อมูลคือ 2 มิติดังนั้นความยาวคือ 3 int testsum ส่วนตัว = 0; // จำนวนการทดสอบทั้งหมดของข้อมูลข้อผิดพลาด int ส่วนตัว = 0; // จำนวนข้อผิดพลาดเริ่มต้น / *** เพิ่มข้อมูลประเภทเดียวกันลงในแผนภูมิ* @param ประเภทประเภท* @param a ส่วนประกอบแรกของข้อมูลทั้งหมด* @param b ส่วนประกอบที่สองของข้อมูลทั้งหมด*/ โมฆะสาธารณะเพิ่ม (ประเภทสตริง, double [] a, double [] b) {double [] [] data = new double [2] [A. length]; สำหรับ (int i = 0; i <a.length; i ++) {data [0] [i] = a [i]; ข้อมูล [1] [i] = b [i]; } xydataset.addseries (พิมพ์ข้อมูล); } / *** วาด* / public void draw () {jfreechart jfreechart = chartfactory.createscatterplot ("การออกกำลังกาย", "x1", "x2", xydataset); ChartFrame Frame = ChartFrame ใหม่ ("ข้อมูลการฝึกอบรม", JFreeChart); frame.pack (); RefineryUtilities.CenterFrameOnsCreen (เฟรม); frame.setVisible (จริง); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ann2 ann2 = ใหม่ ann2 (0.001,100); // สร้างรายการเครือข่ายประสาทเทียม <data> การออกกำลังกาย = new ArrayList <data> (); // สร้างชุดฝึกอบรม // <100) สุ่ม (); double x1 = rd.nextdouble (); // สุ่มสร้างส่วนประกอบหนึ่ง double x2 = rd.nextdouble (); // สุ่มสร้างส่วนประกอบอื่น double [] da = {x1, x2}; // สร้างข้อมูลข้อมูลเวกเตอร์ d = ข้อมูลใหม่ (da, 2, x2> x1+0.5? 1: -1); sum1 = 0; // บันทึกประเภท 1 int sum2 = 0; // บันทึกประเภทบันทึก -1 หมายเลขบันทึกการฝึกอบรมสำหรับ (int i = 0; i <fiscy.size (); i ++) {ถ้า (ออกกำลังกาย (i) .getType () == 1) sum1 ++; อื่นถ้า (fiscy.get (i) .getType () ==-1) sum2 ++; } double [] x1 = ใหม่ double [sum1]; double [] y1 = ใหม่ double [sum1]; double [] x2 = ใหม่ double [sum2]; double [] y2 = ใหม่ double [sum2]; int index1 = 0; int index2 = 0; สำหรับ (int i = 0; i <fiscy.size (); i ++) {ถ้า (fisper.get (i) .getType () == 1) {x1 [index1] = fiscy.get (i) .vector [0]; y1 [index1 ++] = iscish.get (i) .vector [1]; } อื่นถ้า (fiscy.get (i) .getType () ==-1) {x2 [index2] = fiscy.get (i) .Vector [0]; y2 [index2 ++] = iscish.get (i) .vector [1]; }} ann2.add ("1", x1, y1); Ann2.add ("-1", x2, y2); Ann2.Draw (); Ann2.Input (แบบฝึกหัด); // ป้อนชุดการฝึกอบรมในเครือข่ายประสาทเทียม Ann2.Fit (); // ฝึกอบรม Ann2.Showweigths (); // แสดงเวกเตอร์น้ำหนัก // สร้างข้อมูลทดสอบหนึ่งพันข้อมูลด้วยตนเอง (int i = 0; double x1_ = rd.nextdouble (); double x2_ = rd.nextdouble (); double [] da = {x1_, x2_}; การทดสอบข้อมูล = ข้อมูลใหม่ (da, 2, x2_> x1_+0.5? 1: -1); Ann2.Predict (ทดสอบ); // test} system.out.println ("การทดสอบทั้งหมด" + ann2.testsum + "ข้อมูลบิตด้วย" + ann2.error + "บิตข้อผิดพลาดอัตราข้อผิดพลาด:" + ann2.error * 1.0 /ann2.testsum * 100 + "%"); } / ** * * @Param ETA อัตราการเรียนรู้ * @param n_iter ส่วนประกอบน้ำหนักการเรียนรู้ครั้ง * / Public Ann2 (Double Eta, int n_iter) {this.eta = eta; this.n_iter = n_iter; }/*** ป้อนการฝึกอบรมที่ตั้งค่าไปยังเครือข่ายประสาทเทียม* การออกกำลังกาย @param*/อินพุตโมฆะส่วนตัว (รายการ <data> การออกกำลังกาย) {this.exercise = การออกกำลังกาย; // บันทึกน้ำหนักชุดฝึกอบรม = ใหม่สองเท่า = 1; i <weights.length; fisper.get (j) .Type; // y int calculate_result = calculateresult (fiscy.get (j)); // y 'double delta0 = eta * (real_result - calculate_result); // คำนวณการปรับปรุง threshold W0 += delta0; // fisple.get (j) .getDivision (); // ΔW = η*(y-y ')*x น้ำหนัก [k +1] += delta; // w = w+Δw}}}} calculateresult ส่วนตัว (ข้อมูลข้อมูล) {double z = w0 * x0; สำหรับ (int i = 0; i <data.dimention; i ++) z+= data.vector [i] * น้ำหนัก [i+1]; //z=w0x0+w1x1+...+wmxm // ฟังก์ชั่นการเปิดใช้งานถ้า (z> = 0) ส่งคืน 1; ผลตอบแทนอื่น -1; } โมฆะส่วนตัว showweigths () {สำหรับ (double w: weights) system.out.println (w); } โมฆะส่วนตัวทำนาย (ข้อมูลข้อมูล) {int type = calculateresult (ข้อมูล); if (type == data.getType ()) {//system.out.println("precaution ถูกต้อง "); } else {//system.out.println("Precaution Error "); ข้อผิดพลาด ++; } testsum ++; -ผลการทำงาน:
-0.2200000000000000017-0.44168439828154530.44244420202054685 การทดสอบข้อมูลทั้งหมด 10,000 รายการโดยมี 17 ข้อผิดพลาดอัตราความผิดพลาด: 0.169999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับอัลกอริทึม Java ผู้อ่านที่มีความสนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "โครงสร้างข้อมูล Java และการสอนอัลกอริทึม", "บทสรุปของเคล็ดลับการดำเนินงาน Java Dom", "บทสรุปของไฟล์ Java และเคล็ดลับการดำเนินการไดเรกทอรี" และ "สรุป
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน