1. 程式人生 > >利用神經網路逼近sin(x)函式

利用神經網路逼近sin(x)函式

參考書目:智慧控制技術(第二版)

對於逼近正弦函式很多講神經網路的書中都有涉及,算是比較簡單的一個例子。對於這個網路來說,輸入只有一個,那就是取樣點(或者說時間點),輸出顯然只有一個,也就是一個與sin(x)較為相似的函式。在訓練的過程中,sin(x)作為網路的期望值。啟用函式選擇常用的sigmoid函式,取樣點的範圍為[0,2π],在該範圍內sin(x)僅有兩個拐點,經過測試,隱層中含有3個神經元即可很好的完成逼近任務。(1-3-1網路結構)

clear
clc
%引數初始化
l = 0.05;                   %學習速率(步長)
n = 30;                     %取樣點的數目
cells = 3;                  %隱層3個神經元
times = 3000;               %學習次數
x= (linspace(0,2*pi,n));    %[0,2π]區間,均勻30個點
t= sin(x);                  %期望的函式
w1 = rand(cells,1)*0.05;    %輸入層3*1權值向量
w2 = rand(1,cells)*0.05;    %1*3隱含層-輸出層連線權值向量
b1 = rand(cells,1)*0.05;    %3*1隱含層閾值向量
b2 = rand*0.05;             %輸出層閾值
counts = 1;                 %計數
e = zeros(1,times);         %均方誤差

%訓練過程
for i = 1:times
    ei = 0;
    for a = 1:n
        net1 = w1 * x(a) - b1;
        out = logsig(net1);
        net2 = w2 * out - b2;
        y(a) = net2;
        det2 = t(a) - y(a);
        det1 = ((det2 * (w2)').*out).*(1 - out);  %由鏈式求導得出
        w1 = w1 + det1 * x(a) * l;
        w2 = w2 + (det2*out)' * l;
        b1 = b1 - det1 * l;
        b2 = b2 - det2 * l;
        ei = ei + det2^2;         
    end 
    e(i) = ei/n;
    if e(i) < 0.0001                 %期望誤差
        break;
    end
    counts = counts + 1;
end

%輸出部分
for a = 1:n
    net1 = w1 * x(a) - b1;
    out = logsig(net1);
    net2 = w2 * out - b2;
    y(a) = net2;
end
subplot(2,1,1);
plot(x,t,'b-',x,y,'k*-');
grid on 
title('BPsinx');
xlabel('xlable');
ylabel('y = sinx');
%Err curve
if(counts<times)
    count = 1:counts;
    sum = counts;
else
    count = 1:times;
    sum = times;
end
subplot(2,1,2);
plot(count,e(1:sum));
grid on 
title('BPlearning curve');
xlabel('Iteration times');
ylabel('Mean err');
值得注意的是,網路逼近sin(x)完成後,僅僅在給定取樣區間有效,超出這個區間後,網路輸出並不能繼續匹配sin(x)函式,若要逼近更多拐點的函式,應增加隱層神經元的數量。(1-3-1結構的最大能力好像是4個拐點)

相關推薦

利用神經網路逼近sin(x)函式

參考書目:智慧控制技術(第二版) 對於逼近正弦函式很多講神經網路的書中都有涉及,算是比較簡單的一個例子。對於這個網路來說,輸入只有一個,那就是取樣點(或者說時間點),輸出顯然只有一個,也就是一個與sin(x)較為相似的函式。在訓練的過程中,sin(x)作為網路的期望值。啟用

利用BP神經網路逼近函式——Python實現

  文章主要參考https://blog.csdn.net/john_bian/article/details/79503572,原文是matlab版本的實現。在此基礎上,利用Python實現BP網路對函式的逼近。對於BP神經網路的基本原理以及推倒,這裡就不再贅述,可以查閱相

用BP神經網路逼近正弦函式

上一篇文章中用BP神經網路解決了一個簡單的分類問題,接著我又嘗試著試驗了一下用BP神經網路去逼近正弦函式。網路的結果設計如下圖所示。網路中設定輸入層與輸出層均為一個神經元,並且考慮到正弦函式的值域分佈情況,我這一次在輸出層中的啟用函式並沒有使用以前常用的sigmod函式,而是

Matlab一個利用神經網路擬合函式的例子

程式碼: t=[0 3.9 4.1 7.3 8.4 13.1 14.8 16.4 17.7 19 19.7 20.3 21.2 24.5 26.3 27.8 28.9 29 29.8 31.1 32.

利用神經網路為大頭照生成卡通表情包(Memoji)

在今年釋出的 iOS 12 系統中,蘋果推出了一個有趣的新功能——Memoji,這是一種新型的 Animoji,可以用手機的前置攝像頭製作自己的專屬動畫頭像。這個功能剛推出的時候,網上就掀起一波晒 Memoji 的熱潮。 在玩 Memoji 的時候,有沒有想過僅從一張照片上就能生成一個 Memoji?本文就

遺傳演算法+BP神經網路組合求解非線性函式

用遺傳演算法求解非線性問題是常見的求解演算法之一,求解的過程就是隨機生成解,計算適應度,然後選擇,交叉,變異,更新種群,不斷迭代,這樣,每個個體都會向每代中最佳的個體學習並靠攏,這是區域性最優解;而變異操作是為了在靠近當前最優解的同時還有機會變異出更佳的基因,從而跳出區域性最優解而達到全域性最優解。

[深度學習] 神經網路中的啟用函式(Activation function)

20180930 在研究調整FCN模型的時候,對啟用函式做更深入地選擇,記錄學習內容 啟用函式(Activation Function),就是在人工神經網路的神經元上執行的函式,負責將神經元的輸入對映到輸出端。 線性啟用函式:最簡單的linear fun

利用神經網路解決非線性迴歸問題

問題描述 現在我們通常使用神經網路進行分類,但是有時我們也會進行迴歸分析。 如本文的問題: 我們知道一個生物體內的原始有毒物質的量,然後對這個生物體進行治療,向其體內注射一個物質,過一段時間後重新測量這個生物體內有毒物質量的多少。 因此,問題中有兩個輸入,都是標量資料,分別為有毒物質

理解神經網路中的目標函式

這篇部落格主要面向擁有一定機器學習經驗的人,會幫助你直觀理解在訓練神經網路時所用到的各種不同的目標函式。 Introduction 我寫這篇部落格的原因主要有 3 個: 其他部落格中經常會解釋優化演算法,例如 SGD(stochastic gradi

為什麼神經網路中需要啟用函式(activation function)?

在看tensorflow的時候,發現書中程式碼提到,使用ReLU啟用函式完成去線性化為什麼需要啟用函式去線性化?查了一下quaro,覺得這個回答能看明白(順便問一句,截圖算不算引用??)---------------------------------------------

McFly:利用神經網路為 Bash 提供歷史命令搜尋功能

假如你在命令列模式下渡過了很長時間,那麼你必定使用過或者聽說過 BASH 的 反向搜尋 功能,在 Bash 中執行反向搜尋功能的快捷鍵是 Ctrl+r。通過使用這個特性,我們可以找到我們執行過的命令而無需再次輸入它們。當然,你可以使用上下鍵來搜尋你的 bash 命令記錄,但使用 Ctrl+r 快捷鍵可以讓這個

淺析神經網路中的啟用函式

1 什麼是啟用函式 啟用函式就是一類x到y的對映 目的:是為了引入非線性元素,解決線性模型不能解決的問題。 意義:一個沒有啟用函式的神經網路將只不過是一個線性迴歸模型(Linear regression Model)。它並不能表達複雜的資料分佈。 啟用

神經網路中的啟用函式sigmoid、 tanh 、RELU

首先解釋為什麼要做: 再解釋怎麼做: 從數學上來看,Sigmoid函式對中央區的訊號增益較大,對兩側區的訊號增益小,在訊號的特徵空間對映上,有很好的效果。 在具體應用中,t

神經網路中的啟用函式(activation function)-Sigmoid, ReLu, TanHyperbolic(tanh), softmax, softplus

  不管是傳統的神經網路模型還是時下熱門的深度學習,我們都可以在其中看到啟用函式的影子。所謂啟用函式,就是在神經網路的神經元上執行的函式,負責將神經元的輸入對映到輸出端。常見的啟用函式包括Sigmoid、TanHyperbolic(tanh)、ReLu、 sof

Python 04 神經網路逼近股票收盤均價

import tensorflow as tf import numpy as np import matplotlib.pyplot as plt data = np.linspace(1,15,15) endPrice = np.array([2511.90,2538.26,2510.68,25

深度學習:神經網路中的啟用函式

軟飽和和硬飽和sigmoid 在定義域內處處可導,且兩側導數逐漸趨近於0。Bengio 教授等[1]將具有這類性質的啟用函式定義為軟飽和啟用函式。與極限的定義類似,飽和也分為左飽和與右飽和。與軟飽和相對的是硬飽和啟用函式,即:f'(x)=0,當 |x| > c,其中 c 為常數。同理,硬飽和也分為左飽和

神經網路】RELU 啟用函式及其他相關的函式

轉載自:http://blog.csdn.net/u013146742/article/details/51986575 日常 coding 中,我們會很自然的使用一些啟用函式,比如:sigmoid、ReLU等等。不過好像忘了問自己一(n)件事: 為什

利用C語言實現sin(x)曲線與cos(x)曲線圖形的同時顯示

    在前面兩天的部落格中,我們學會了如何用C語言分別繪製sin(x)和cos(x)在0°~360°的曲線。     今天我們來試試將兩條曲線同時繪製出來。 要求:     在螢幕上顯示0°~360°的cos(x)曲線與sin(x)曲線的疊加圖形。其中cos(x)圖形用

神經網路常見的啟用函式彙總

1.啟用函式的作用 在神經網路中,啟用函式的作用是能夠給神經網路加入一些非線性因素,使得神經網路可以更好地解決較為複雜的問題。 比如在下面的這個問題中: 如上圖所示,這是一個簡單的線性分類問題,只需要一條直線就可以很好地分類。當我們碰到下圖問題時,無法通過一條直線將樣

深層神經網路之經典損失函式

一, 交叉熵函式 交叉熵是一個資訊理論中的概念,但在此我們不深究它的本身意義,我們要知道,交叉熵刻畫了兩個概率分佈之間的距離,在深度神經網路的構建中,我們知道真實值和預測值之間會存在一個差值,這也就是為什麼使用交叉熵函式的原因. 給定兩個概率分佈p,q, 通過q來表示p的