国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

JAVA實現感知器算法

2024-07-13 10:15:00
字體:
來源:轉載
供稿:網友

簡述

隨著互聯網的高速發展,A(AI)B(BigData)C(Cloud)已經成為當下的核心發展方向,假如三者深度結合的話,AI是其中最核心的部分。所以如果說在未來社會,每個人都必須要學會編程的話,那么對于程序員來說,人工智能則是他們所必須掌握的技術(科技發展真tm快)。

這篇文章介紹并用JAVA實現了一種最簡單的感知器網絡,不糾結于公式的推導,旨在給大家提供一下學習神經網絡的思路,對神經網絡有一個大概的認識。

感知器網絡模型分析

首先看一張圖

java,感知器,算法

如果稍微對神經網絡感興趣的一定對這張圖不陌生,這張圖是神經元的結構圖
X1~Xm表示輸入,W1~Wm表示突觸權值,Σ表示求和結點,Activation function表示激活函數,之后輸出一個結果,具體的流程是

神經元接收到輸入,每個輸入都會與其相對路徑上的權值相乘,到了求和結點進行求和,這里把求和結點的結果設為z :

z = X1 * W1 + X2 * W2 + X3 * W3 + ...... + Xm * Wm

之后將 z 傳入到激活函數(這里我們稱激活函數為 f)進行二分類模式識別 :

if f(x) > e,y = 1else y = -1e 為閾值y 為分類結果

這里可以看出,如果 f(x) 的值大于閾值,得到分類 y = 1,反之 y = -1
注:相對于生物神經元受到刺激表示的反應,如果刺激在可接受范圍之內,則神經元會抑制刺激(y = -1),如果超過范圍則會興奮(y = 1),而這個范圍的分水嶺就是閾值(e)

學習

我們發現,如果權值和閾值都固定的話,那么這個神經網絡就沒有存在的意義了,所以我們引入學習的概念,通過學習,讓神經網絡去修改權值和閾值,從而可以動態的修正模式識別的正確率,這才是機器學習的本質。

那么如何學習呢?當我們在使用之前我們需要提供給此網絡一組樣本數據(這里采取的是有教師模式學習),樣本數據包括輸入數據x和正確的識別結果y'。
當我們輸入訓練數據x得到模式識別y之后進行判斷,如果 y != y' ,則會去調整此網絡的權值和閾值,調整請看公式,μ 表示學習率(修正率),update 表示需要修正值:

update = μ * (yi - y')update = (f(x) - y')mΣ Wi += update * Xii=1e += update

當感知器分類結果等于正確分類,update = 0,不調整網絡;如果不等于正確分類,則會調整全部的權值(w)與閾值(e)

以上就是我所介紹的感知器最簡單的學習流程:

輸入數據->求和得到z->通過激活函數等到分類結果->分類結果與正確結果不符則調整網絡

下面就讓我們來實現這個簡單的神經網絡吧

Java代碼實現

這里我所實現的是通過神經網絡學習識別整數的正負
首先定義一個感知器的類

/** * Created by CimZzz on 12/2/17. * */public class Perceptron { /**  * 學習率  */ private final float learnRate; /**  * 學習次數  */ private final int studyCount; /**  * 閾值  */ private float e; /**  * 權值  * 因為判斷整數正負只需要一條輸入,所以這里只有一個權值,多條輸入可以設置為數組  */ private float w; /**  * 每次學習的正確率  */ private float[] correctRate; // /**  * 構造函數初始化學習率,學習次數,權值、閾值初始化為0  * @param learnRate 學習率(取值范圍 0 < learnRate < 1)  * @param studyCount 學習次數  */ public Perceptron(float learnRate, int studyCount) {  this.learnRate = learnRate;  this.studyCount = studyCount;  this.e = 0;  this.w = 0;  this.correctRate = new float[studyCount]; } /**  * 學習函數,samples 是一個包含輸入數據和分類結果的二維數組,  * samples[][0] 表示輸入數據  * samples[][1] 表示正確的分類結果  * @param samples 訓練數據  */ public void fit(int[][] samples) {  int sampleLength = samples.length;  for(int i = 0 ; i < studyCount ; i ++) {   int errorCount = 0;   for (int[] sample : samples) {    float update = learnRate * (sample[1]-predict(sample[0]));    //更新權值、閾值    w += update * sample[0];    e += update;    //計算錯誤次數    if (update != 0)     errorCount++;   }   //計算此次學習的正確率   correctRate[i] = 1 - errorCount * 1.0f / sampleLength;  } } /**  * 求和函數,模擬求和結點操作 輸入數據 * 權值  * @param num 輸入數據  * @return 求和結果 z  */ private float sum(int num) {  return num * w + e; } /**  * 激活函數,通過求和結果 z 和閾值 e 進行判斷  * @param num 輸入數據  * @return 分類結果  */ public int predict(int num) {  return sum(num) >= 0 ? 1 : -1; } /**  * 打印正確率  */ public void printCorrectRate() {  for (int i = 0 ; i < studyCount ; i ++)   System.out.printf("第%d次學習的正確率 -> %.2f%%/n",i + 1,correctRate[i] * 100); }}

然后寫生成訓練數據的函數

 /**  * 生成訓練數據  * @return 訓練數據  */ private static int[][] genStudyData() {  //這里我們取 -100 ~ 100 之間的整數,大于0的設為模式 y = 1,反之為 y = -1  int[][] data = new int[201][2];  for(int i = -100 , j = 0; i <= 100 ; i ++ , j ++) {   data[j][0] = i;   data[j][1] = i >= 0 ? 1 : -1;  }  return data; } /**  * 生成訓練數據  * @return 訓練數據  */ private static int[][] genStudyData2() {  //這里我們取 1~250 之間的整數,大于125的設為模式 y = 1,反之為 y = -1  int[][] data = new int[250][2];  for(int i = 1 , j = 0; i <= 250 ; i ++ , j ++) {   data[j][0] = i;   data[j][1] = i >= 125 ? 1 : -1;  }  return data; }

最后是主函數

public static void main(String[] args) {  //這里的學習率和訓練次數可以根據情況人為調整  Perceptron perceptron = new Perceptron(0.4f,500);  perceptron.fit(genStudyData());  perceptron.printCorrectRate();  System.out.println(perceptron.predict(-1));  System.out.println(perceptron.predict(126)); }

大家可以測試一下

局限性

這個感知器神經網絡比較簡單,是適用于可線性劃分的數據,比如一維的話正數和負數,二維的坐標象限分類;對于不可線性劃分的數據無法進行正確的分類,如尋找質數等

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梅州市| 韩城市| 东方市| 罗田县| 托克逊县| 封丘县| 龙里县| 衡阳县| 罗定市| 铁岭市| 文登市| 华坪县| 馆陶县| 开原市| 西乌珠穆沁旗| 开化县| 富阳市| 呼伦贝尔市| 龙山县| 偃师市| 本溪市| 清原| 陆丰市| 江川县| 新乐市| 花垣县| 韶关市| 宁陵县| 甘肃省| 溧阳市| 磐石市| 枣强县| 新平| 安平县| 澄城县| 松阳县| 内黄县| 威远县| 锡林浩特市| 荔浦县| 南部县|