一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 基于Java實(shí)現(xiàn)的一層簡(jiǎn)單人工神經(jīng)網(wǎng)絡(luò)算法示例

基于Java實(shí)現(xiàn)的一層簡(jiǎn)單人工神經(jīng)網(wǎng)絡(luò)算法示例

2021-03-01 14:36土豆拍死馬鈴薯 Java教程

這篇文章主要介紹了基于Java實(shí)現(xiàn)的一層簡(jiǎn)單人工神經(jīng)網(wǎng)絡(luò)算法,結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)人工神經(jīng)網(wǎng)絡(luò)的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了基于java實(shí)現(xiàn)的一層簡(jiǎn)單人工神經(jīng)網(wǎng)絡(luò)算法。分享給大家供大家參考,具體如下:

先來(lái)看看筆者繪制的算法圖:

基于Java實(shí)現(xiàn)的一層簡(jiǎn)單人工神經(jīng)網(wǎng)絡(luò)算法示例

基于Java實(shí)現(xiàn)的一層簡(jiǎn)單人工神經(jīng)網(wǎng)絡(luò)算法示例

2、數(shù)據(jù)類(lèi)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.util.arrays;
public class data {
  double[] vector;
  int dimention;
  int type;
  public double[] getvector() {
    return vector;
  }
  public void setvector(double[] vector) {
    this.vector = vector;
  }
  public int getdimention() {
    return dimention;
  }
  public void setdimention(int dimention) {
    this.dimention = dimention;
  }
  public int gettype() {
    return type;
  }
  public void settype(int type) {
    this.type = type;
  }
  public data(double[] vector, int dimention, int type) {
    super();
    this.vector = vector;
    this.dimention = dimention;
    this.type = type;
  }
  public data() {
  }
  @override
  public string tostring() {
    return "data [vector=" + arrays.tostring(vector) + ", dimention=" + dimention + ", type=" + type + "]";
  }
}

3、簡(jiǎn)單人工神經(jīng)網(wǎng)絡(luò)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package cn.edu.hbut.chenjie;
import java.util.arraylist;
import java.util.list;
import java.util.random;
import org.jfree.chart.chartfactory;
import org.jfree.chart.chartframe;
import org.jfree.chart.jfreechart;
import org.jfree.data.xy.defaultxydataset;
import org.jfree.ui.refineryutilities;
public class ann2 {
  private double eta;//學(xué)習(xí)率
  private int n_iter;//權(quán)重向量w[]訓(xùn)練次數(shù)
  private list<data> exercise;//訓(xùn)練數(shù)據(jù)集
  private double w0 = 0;//閾值
  private double x0 = 1;//固定值
  private double[] weights;//權(quán)重向量,其長(zhǎng)度為訓(xùn)練數(shù)據(jù)維度+1,在本例中數(shù)據(jù)為2維,故長(zhǎng)度為3
  private int testsum = 0;//測(cè)試數(shù)據(jù)總數(shù)
  private int error = 0;//錯(cuò)誤次數(shù)
  defaultxydataset xydataset = new defaultxydataset();
  /**
   * 向圖表中增加同類(lèi)型的數(shù)據(jù)
   * @param type 類(lèi)型
   * @param a 所有數(shù)據(jù)的第一個(gè)分量
   * @param b 所有數(shù)據(jù)的第二個(gè)分量
   */
  public void add(string type,double[] a,double[] b)
  {
    double[][] data = new double[2][a.length];
    for(int i=0;i<a.length;i++)
    {
      data[0][i] = a[i];
      data[1][i] = b[i];
    }
    xydataset.addseries(type, data);
  }
  /**
   * 畫(huà)圖
   */
  public void draw()
  {
    jfreechart jfreechart = chartfactory.createscatterplot("exercise", "x1", "x2", xydataset);
    chartframe frame = new chartframe("訓(xùn)練數(shù)據(jù)", jfreechart);
    frame.pack();
    refineryutilities.centerframeonscreen(frame);
    frame.setvisible(true);
  }
  public static void main(string[] args)
  {
    ann2 ann2 = new ann2(0.001,100);//構(gòu)造人工神經(jīng)網(wǎng)絡(luò)
    list<data> exercise = new arraylist<data>();//構(gòu)造訓(xùn)練集
    //人工模擬1000條訓(xùn)練數(shù)據(jù) ,分界線為x2=x1+0.5
    for(int i=0;i<1000000;i++)
    {
      random rd = new random();
      double x1 = rd.nextdouble();//隨機(jī)產(chǎn)生一個(gè)分量
      double x2 = rd.nextdouble();//隨機(jī)產(chǎn)生另一個(gè)分量
      double[] da = {x1,x2};//產(chǎn)生數(shù)據(jù)向量
      data d = new data(da, 2, x2 > x1+0.5 ? 1 : -1);//構(gòu)造數(shù)據(jù)
      exercise.add(d);//將訓(xùn)練數(shù)據(jù)加入訓(xùn)練集
    }
    int sum1 = 0;//記錄類(lèi)型1的訓(xùn)練記錄數(shù)
    int sum2 = 0;//記錄類(lèi)型-1的訓(xùn)練記錄數(shù)
    for(int i = 0; i < exercise.size(); i++)
    {
      if(exercise.get(i).gettype()==1)
        sum1++;
      else if(exercise.get(i).gettype()==-1)
        sum2++;
    }
    double[] x1 = new double[sum1];
    double[] y1 = new double[sum1];
    double[] x2 = new double[sum2];
    double[] y2 = new double[sum2];
    int index1 = 0;
    int index2 = 0;
    for(int i = 0; i < exercise.size(); i++)
    {
      if(exercise.get(i).gettype()==1)
      {
        x1[index1] = exercise.get(i).vector[0];
        y1[index1++] = exercise.get(i).vector[1];
      }
      else if(exercise.get(i).gettype()==-1)
      {
        x2[index2] = exercise.get(i).vector[0];
        y2[index2++] = exercise.get(i).vector[1];
      }
    }
    ann2.add("1", x1, y1);
    ann2.add("-1", x2, y2);
    ann2.draw();
    ann2.input(exercise);//將訓(xùn)練集輸入人工神經(jīng)網(wǎng)絡(luò)
    ann2.fit();//訓(xùn)練
    ann2.showweigths();//顯示權(quán)重向量
    //人工生成一千條測(cè)試數(shù)據(jù)
    for(int i=0;i<10000;i++)
    {
      random rd = new random();
      double x1_ = rd.nextdouble();
      double x2_ = rd.nextdouble();
      double[] da = {x1_,x2_};
      data test = new data(da, 2, x2_ > x1_+0.5 ? 1 : -1);
      ann2.predict(test);//測(cè)試
    }
    system.out.println("總共測(cè)試" + ann2.testsum + "條數(shù)據(jù),有" + ann2.error + "條錯(cuò)誤,錯(cuò)誤率:" + ann2.error * 1.0 /ann2.testsum * 100 + "%");
  }
  /**
   *
   * @param eta 學(xué)習(xí)率
   * @param n_iter 權(quán)重分量學(xué)習(xí)次數(shù)
   */
  public ann2(double eta, int n_iter) {
    this.eta = eta;
    this.n_iter = n_iter;
  }
  /**
   * 輸入訓(xùn)練集到人工神經(jīng)網(wǎng)絡(luò)
   * @param exercise
   */
  private void input(list<data> exercise) {
    this.exercise = exercise;//保存訓(xùn)練集
    weights = new double[exercise.get(0).dimention + 1];//初始化權(quán)重向量,其長(zhǎng)度為訓(xùn)練數(shù)據(jù)維度+1
    weights[0] = w0;//權(quán)重向量第一個(gè)分量為w0
    for(int i = 1; i < weights.length; i++)
      weights[i] = 0;//其余分量初始化為0
  }
  private void fit() {
    for(int i = 0; i < n_iter; i++)//權(quán)重分量調(diào)整n_iter次
    {
      for(int j = 0; j < exercise.size(); j++)//對(duì)于訓(xùn)練集中的每條數(shù)據(jù)進(jìn)行訓(xùn)練
      {
        int real_result = exercise.get(j).type;//y
        int calculate_result = calculateresult(exercise.get(j));//y'
        double delta0 = eta * (real_result - calculate_result);//計(jì)算閾值更新
        w0 += delta0;//閾值更新
        weights[0] = w0;//更新w[0]
        for(int k = 0; k < exercise.get(j).getdimention(); k++)//更新權(quán)重向量其它分量
        {
          double delta = eta * (real_result - calculate_result) * exercise.get(j).vector[k];
          //δw=η*(y-y')*x
          weights[k+1] += delta;
          //w=w+δw
        }
      }
    }
  }
  private int calculateresult(data data) {
    double z = w0 * x0;
    for(int i = 0; i < data.dimention; i++)
      z += data.vector[i] * weights[i+1];
    //z=w0x0+w1x1+...+wmxm
    //激活函數(shù)
    if(z>=0)
      return 1;
    else
      return -1;
  }
  private void showweigths()
  {
    for(double w : weights)
      system.out.println(w);
  }
  private void predict(data data) {
    int type = calculateresult(data);
    if(type == data.gettype())
    {
      //system.out.println("預(yù)測(cè)正確");
    }
    else
    {
      //system.out.println("預(yù)測(cè)錯(cuò)誤");
      error ++;
    }
    testsum ++;
  }
}

運(yùn)行結(jié)果:

?
1
2
3
4
-0.22000000000000017
-0.4416843982815453
0.442444202054685
總共測(cè)試10000條數(shù)據(jù),有17條錯(cuò)誤,錯(cuò)誤率:0.16999999999999998%

基于Java實(shí)現(xiàn)的一層簡(jiǎn)單人工神經(jīng)網(wǎng)絡(luò)算法示例

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

原文鏈接:http://blog.csdn.net/csj941227/article/details/73325695

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 高清不卡免费一区二区三区 | 52av我爱avhaose01好 | 5g996未满十八 | 国产精品性视频免费播放 | 99热网址| 亚洲小视频网站 | 欧美黑人换爱交换乱理伦片 | 国产一二区视频 | 天干夜天天夜天干天ww | 欧美日韩国产中文字幕 | 亚洲AV 中文字幕 国产 欧美 | 欧美性一级交视频 | 欧美日韩国产亚洲一区二区三区 | 插得好爽 | 美女扒开胸罩露出胸大乳 | 国产趴着打光屁股sp抽打 | 精品久久伦理中文字幕 | 小寡妇水真多好紧 | 好大好粗好爽 | 吃大胸寡妇的奶 | 青青草人人| 91大神第九部红酒气质女 | 欧美日韩一区二区三区在线观看 | 色综合天天综合网站中国 | 国内精品久久久久久中文字幕 | 欧美三级不卡视频 | 好爽好深好猛好舒服视频上 | 国产a免费观看 | 白丝捆绑调教 | 久久内在线视频精品mp4 | 免费网址视频在线看 | 精品视频手机在线观看免费 | 亚洲 日本 天堂 国产 在线 | 亚洲成人99 | 狠狠干奇米 | 99在线免费观看视频 | 免费毛片在线观看 | yellow高清免费观看日本 | 亚洲一区二区三区不卡在线播放 | coolgay男男gayxxx chinese壮直男gay老年人 chinese野外gay军人 | 欧美成人乱弄视频 |