A. R語言可以搭建深度學習演算法嗎
<ul><li>深度學習的概念源於人工神經網路的研究。含多隱層的多層感知器就是一種深度學習結構。深度學習通過組合低層特徵形成更加抽象的高層表示屬性類別或特徵,以發現數據的分布式特徵表示。[1]
深度學習的概念由Hinton等人於2006年提出。基於深度置信網路(DBN)提出非監督貪心逐層訓練演算法,為解決深層結構相關的優化難題帶來希望,隨後提出多層自動編碼器深層結構。此外Lecun等人提出的卷積神經網路是第一個真正多層結構學習演算法,它利用空間相對關系減少參數數目以提高訓練性能。[1]
深度學習是機器學習研究中的一個新的領域,其動機在於建立、模擬人腦進行分析學習的神經網路,它模仿人腦的機制來解釋數據,例如圖像,聲音和文本。[2] </li></ul>
B. 如何在R語言中進行神經網路模型的建立
不能發鏈接,所以我復制過來了。
#載入程序和數據
library(RSNNS)
data(iris)
#將數據順序打亂
iris <- iris[sample(1:nrow(iris),length(1:nrow(iris))),1:ncol(iris)]
#定義網路輸入
irisValues <- iris[,1:4]
#定義網路輸出,並將數據進行格式轉換
irisTargets <- decodeClassLabels(iris[,5])
#從中劃分出訓練樣本和檢驗樣本
iris <- splitForTrainingAndTest(irisValues, irisTargets, ratio=0.15)
#數據標准化
iris <- normTrainingAndTestSet(iris)
#利用mlp命令執行前饋反向傳播神經網路演算法
model <- mlp(iris$inputsTrain, iris$targetsTrain, size=5, learnFunc="Quickprop", learnFuncParams=c(0.1, 2.0, 0.0001, 0.1),maxit=100, inputsTest=iris$inputsTest, targetsTest=iris$targetsTest)
#利用上面建立的模型進行預測
predictions <- predict(model,iris$inputsTest)
#生成混淆矩陣,觀察預測精度
confusionMatrix(iris$targetsTest,predictions)
#結果如下:
# predictions
#targets 1 2 3
# 1 8 0 0
# 2 0 4 0
# 3 0 1 10
C. 60-R語言中的神經網路
《深度學習精要(基於R語言)》學習筆記
機器學習主要用於開發和使用那些從原始數據中學習、總結出來的用於進行預測的演算法。
深度學習是一種強大的多層架構,可以用於模式識別、信號檢測以及分類或預測等多個領域。
神經網路包括一系列的神經元,或者叫作節點,它們彼此連結並處理輸入。神經元之間的連結經過加權處理,權重取決於從數據中學習、總結出的使用函數。一組神經元的激活和權重(從數據中自適應地學習)可以提供給其他的神經元,其中一些最終神經元的激活就是預測。
經常選擇的激活函數是sigmoid函數以及雙曲正切函數tanh,因為徑向基函數是有效的函數逼近,所以有時也會用到它們。
權重是從每個隱藏單元到每個輸出的路徑,對第i個的輸出通過(w_i)表示。如創建隱藏層的權重,這些權重也是從數據中學習得到的。分類會經常使用一種最終變換,softmax函數。線性回歸經常使用恆等(identity)函數,它返回輸入值。權重必須從數據中學習得到,權重為零或接近零基本上等同於放棄不必要的關系。
R中神經網路相關包:
一旦集群完成初始化,可以使用R或本地主機(127.0.0.1:54321)提供的Web介面與它連接。
如果數據集已經載入到R,使用as.h2o()函數:
如果數據沒有載入R,可以直接導入到h2o中:
也可以直接導入網路上的文件:
導入基於圖片識別手寫體數字,數據集的每一列(即特徵),表示圖像的一個像素。每張圖像都經過標准化處理,轉化成同樣的大小,所以所有圖像的像素個數都相同。第一列包含真實的數據標簽,其餘各列是黑暗像素的值,它用於分類。
使用caret包訓練模型:
生成數據的一組預測,查看柱狀圖:
跟訓練集數據柱狀圖對比,很明顯模型不是最優的。
通過混淆矩陣檢查模型性能:
No Information Rate(無信息率)指不考慮任何信息而僅僅通過猜測來決定最頻繁的類的准確度期望。在情形「1」中,它在11.16%的時間中發生。P值(P-Value [Acc > NIR])檢驗了觀測准確度(Accuracy : 0.3674)是否顯著不同於無信息率(11.16%)。
Class: 0的靈敏度(Sensitivity)可以解釋為:89.07%的數字0被正確地預測為0。特異度(Specificity)可以解釋為:95.14%的預測為非數字0被預測為不是數字0。
檢出率(Detection Rate)是真陽性的百分比,而最後的檢出預防度(detection prevalence)是預測為陽性的實例比例,不管它們是否真的為陽性。
平衡准確度(balanced accuracy)是靈敏度和特異度的平均值。
接下來我們通過增加神經元的個數來提升模型的性能,其代價是模型的復雜性會顯著增加:
隱藏神經元的數量從5個增加到10個,樣本內性能的總准確度從36.74% 提升到了 65.4%。我們繼續增加隱藏神經元的數量:
增加到40個神經元後准確度跟10個神經元的一樣,還是65.4%。如果是商業問題,還需要繼續調節神經元的數量和衰變率。但是作為學習,模型對數字9的表現比較差,對其他數字都還行。
RSNNS包提供了使用斯圖加特神經網路模擬器(Stuttgart Neural Network Simulator , SNNS)模型的介面,但是,對基本的、單隱藏層的、前饋的神經網路,我們可以使用mlp()這個更為方便的封裝函數,它的名稱表示多層感知器(multi-layer perceptron)。
RSNNS包要求輸入為矩陣、響應變數為一個啞變數的 矩陣 ,因此每個可能的類表示成矩陣列中的 0/1 編碼。
通過decodeClassLabels()函數可以很方便的將數據轉換為啞變數矩陣。
預測結果的值為1-10,但是實際值為0-9,所以在生成混淆矩陣時,需要先減去1:
RSNNS包的學習演算法使用了相同數目的隱藏神經元,計算結果的性能卻有極大提高。
函數I()有兩個作用:
1.在對data.frame的調用中將對象包含在I()中來保護它,防止字元向量到factor的轉換和名稱的刪除,並確保矩陣作為單列插入。
2.在formula函數中,它被用來禁止將「+」、「-」、「*」和「^」等運算符解釋為公式運算符,因此它們被用作算術運算符。
從RSNNS包返回的預測值(pred.ml4)中可以看到,一個觀測可能有40%的概率成為「5」,20%的概率成為「6」,等等。最簡單的方法就是基於高預測概率來對觀測進行分類。RSNNS包有一種稱為贏者通吃(winner takes all,WTA)的方法,只要沒有關系就選擇概率最高的類,最高的概率高於用戶定義的閾值(這個閾值可以是0),而其他類的預測概率都低於最大值減去另一個用戶定義的閾值,否則觀測的分類就不明了。如果這兩個閾值都是0(預設),那麼最大值必然存在並且唯一。這種方法的優點是它提供了某種質量控制。
但是在實際應用中,比如一個醫學背景下,我們收集了病人的多種生物指標和基因信息,用來分類確定他們是否健康,是否有患癌症的風險,是否有患心臟病的風險,即使有40%的患癌概率也需要病人進一步做檢查,即便他健康的概率是60%。RSNNS包中還提供一種分類方法稱為「402040」,如果一個值高於用戶定義的閾值,而所有的其他值低於用戶定義的另一個閾值。如果多個值都高於第一個閾值,或者任何值都不低於第二個閾值,我們就把觀測定性為未知的。這樣做的目的是再次給出了某種質量控制。
「0」分類表示未知的預測。
通常來說,過擬合指模型在訓練集上的性能優於測試集。過擬合發生在模型正好擬合了訓練數據的雜訊部分的時候。因為考慮了雜訊,它似乎更准確,但一個數據集和下一個數據集的雜訊不同,這種准確度不能運用於除了訓練數據之外的任何數據 — 它沒有一般化。
使用RSNNS模型對樣本外數據預測:
模型在第一個5000行上的准確度為85.1%,在第二個5000行上的准確度減少為80%,損失超過5%,換句話說,使用訓練數據來評價模型性能導致了過度樂觀的准確度估計,過度估計是5%。
這個問題我們後面再處理。
D. R語言做神經網路,多個輸入多個輸出的命令怎麼寫
net=newff(minmax(p),[3,5,4],{'tansig','purelin','logsig'},'trainlm');
net.trainParam.goal= 0.00001;
net.trainParam.epochs= 10000;
net= train(net,p,t);
Y=sim(net,p);
隱含層數通常取輸入層數的1.2~1.5倍,但隱含層數增加相對訓練效果會好些。
輸出結果是根據你的T決定的,你這個如果訓練效果好的話輸出值的和就為1。