神经网络-回归(Python)
神經網絡-回歸(Python)
- 回歸與神經網絡簡介
- 回歸分析
- 神經網絡
- 神經網絡學習算法原理
- 監督學習和無監督學習
- 多層感知器——MLP
- BP神經網絡
- 代碼實現(利用sklearn庫)
- 根據算法寫出BP
回歸與神經網絡簡介
回歸分析
回歸分析(regression analysis)是確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法。
回歸分析的作用是:
①從一組數據出發確定某些變量之間的定量關系式
②對變量間這些關系式進行統計檢驗。并從影響某一個變量的多個變量中找出影響顯著的變量
③利用所求出的關系式,根據一個變量或多個變量取值估計或預測另一個特定變量的取值。
神經網絡
網絡模型包括其輸入輸出模型、作用函數模型、誤差計算模型和自學習模型
輸入層:輸入神經元定義數據挖掘模型所有的輸入屬性值以及概率。一個感知器可以接收多個輸入(x_1,?_2 ……?_?),每個輸入上有一個權值?_?,此外還有一個偏置項b,就是上圖中的?_0。
隱含層:隱藏神經元接受來自輸入神經元的輸入,并向輸出神經元提供輸出。隱藏層是向各種輸入概率分配權重的位置。
輸出層:輸出神經元代表數據挖掘模型的可預測屬性值。
激活函數:所謂激活函數(Activation Function),就是在人工神經網絡的神經元上運行的函數,負責將神經元的輸入映射到輸出端,如sigmod函數、tanh函數等。
神經網絡學習算法原理
1、網絡初始化(給各連接權值分別賦一個(-1,1)內的隨機數。給定計算精度和最大學習次數。
2、將訓練樣本通過神經網絡進行前向傳播計算。
3、計算輸出誤差,通常用均方差。網絡誤差通過隨機梯度下降法來最小化,通過反向傳播來不斷調整網絡的權值和閾值,使網絡的誤差平方和最小。
4、判斷網絡誤差是否滿足要求,當誤差達到預設精度或學習次數大于所設定的最大次數,則結束算法。否則進行下一輪學習,直至結束。
監督學習和無監督學習
機器學習有一類學習方法叫做監督學習,它是說為了訓練一個模型,我們要提供這樣一堆訓練樣本:每個訓練樣本既包括輸入特征x,也包括對應的輸出y(y也叫做標記,label)。也就是說,我們要找到很多人,我們既知道他們的特征(工作年限,行業…),也知道他們的收入。我們用這樣的樣本去訓練模型,讓模型既看到我們提出的每個問題(輸入特征x),也看到對應問題的答案(標記y)。當模型看到足夠多的樣本之后,它就能總結出其中的一些規律。然后,就可以預測那些它沒看過的輸入所對應的答案了。
另外一類學習方法叫做無監督學習,這種方法的訓練樣本中只有x而沒有y。模型可以總結出特征的一些規律,但是無法知道其對應的答案y。
多層感知器——MLP
神經元——感知器
多層感知器的優點:
可以學習得到非線性模型。
可以學習得到實時模型(在線學習)
多層感知器(MLP)的缺點:
具有隱藏層的 MLP 具有非凸的損失函數,它有不止一個的局部最小值。 因此不同的隨機權重初始化會導致不同的驗證集準確率。
MLP 需要調試一些超參數,例如隱藏層神經元的數量、層數和迭代輪數。
MLP 對特征歸一化很敏感.
我們需要知道一個神經網絡的每個連接上的權值是如何得到的。我們可以說神經網絡是一個模型,那么這些權值就是模型的參數,也就是模型要學習的東西。然而,一個神經網絡的連接方式、網絡的層數、每層的節點數這些參數,則不是學習出來的,而是人為事先設置的。對于這些人為設置的參數,我們稱之為超參數(Hyper-Parameters)。
(隱藏節點數,學習步長,迭代次數等)
BP神經網絡
誤差的反向傳播(“BP”)
誤差反向傳播:輸出誤差(某種形式)->隱層(逐層)->輸入層????其主要目的是通過將輸出誤差反傳,將誤差分攤給各層所有單元,從而獲得各層單元的誤差信號進而修正各單元的權值(其過程,是一個權值調整的過程)。注:權值調整的過程,也就是網絡的學習訓練過程(學習也就是這么的由來,權值調整)。
標準BP算法的缺陷:
1)易形成局部極小(屬貪婪算法,局部最優)而得不到全局最優;????
2)訓練次數多使得學習效率低下,收斂速度慢(需做大量運算);
3)隱節點的選取缺乏理論支持;??
4)訓練時學習新樣本有遺忘舊樣本趨勢。??
??注:改進算法—增加動量項、自適應調整學習速率及引入陡度因子
引用文本
代碼實現(利用sklearn庫)
簡單的MLP
第一種
from sklearn.neural_network import MLPRegressor from sklearn.preprocessing import StandardScaler from sklearn.cross_validation import train_test_split import pandas as pdinput = pd.read_excel("C:/Users/Lenovo/Desktop/數據集/in.xlsx") output = pd.read_excel("C:/Users/Lenovo/Desktop/數據集/out.xlsx") x_train, x_test, y_train, y_test = train_test_split(input,output,test_size=0.2, random_state=0) X = x_train y = y_train scaler = StandardScaler() # 標準化轉換 scaler.fit(X) # 訓練標準化對象 X = scaler.transform(X) # 轉換數據集 #(多層感知器對特征的縮放是敏感的,所以需要歸一化你的數據。 例如,將輸入向量 X 的每個屬性放縮到到 [0, 1] 或 [-1,+1] ,或者將其標準化使它具有 0 均值和方差 1。 為了得到有意義的結果,必須對測試集也應用 相同的尺度縮放。 可以使用 StandardScaler 進行標準化。) # solver=‘sgd', MLP的求解方法:L-BFGS 在小數據上表現較好,Adam 較為魯棒,SGD在參數調整較優時會有最佳表現(分類效果與迭代次數);SGD標識隨機梯度下降。 # alpha:L2的參數:MLP是可以支持正則化的,默認為L2,具體參數需要調整 # hidden_layer_sizes=(2, 1) hidden層2層,第一層2個神經元,第二層1個神經元),2層隱藏層,也就有3層神經網絡 clf = MLPRegressor(solver=‘sgd', alpha=1e-5,hidden_layer_sizes=(2, 1), random_state=1) clf.fit(X, y) print('預測結果:', clf.predict([[5,1]])) # 預測某個輸入對象 cengindex = 0 for wi in clf.coefs_:cengindex += 1 # 表示底第幾層神經網絡。print('第%d層網絡層:' % cengindex)print('權重矩陣維度:',wi.shape)print('系數矩陣:\n',wi)
隨機梯度下降(SGD)
Adam 類似于 SGD,因為它是 stochastic optimizer (隨機優化器),但它可以根據低階矩的自適應估計自動調整參數更新的量。
使用 SGD 或 Adam ,訓練過程支持在線模式和小批量學習模式。
L-BFGS 是利用 Hessian 矩陣來近似函數的二階偏導數的求解器,它使用 Hessian 的逆矩陣來近似進行參數更新。
如果所選擇的方法是 ‘L-BFGS’,訓練過程不支持在線學習模式和小批量學習模式。
第二種
MLPRegressor
通過輸出層沒有激活函數的反向傳播算法,或者也可看做恒等函數作為激活函數,實現了多層感知器。因此,其使用方差作為損失函數,輸出是利系列連續的值。
MLPRegressor 也支持多輸出的回歸,即一個樣本可能有不止一個目標值。
(MLPClassifier利用神經網絡做分類)
根據算法寫出BP
import pandas as pd import math import random from sklearn.model_selection import train_test_splitinput =pd.read_excel("C:/Users/Lenovo/Desktop/數據集/in.xlsx") output= pd.read_excel("C:/Users/Lenovo/Desktop/數據集/out.xlsx") x_train, x_test, y_train, y_test = train_test_split(input,output,test_size=0.2, random_state=0)#導入數據 random.seed(0) #在數區間 a ~ b 中,隨機生成一個float數 def rand(a, b):return (b - a) * random.random() + a# random.random() 生成一個0~1的浮點數 #創建一個指定大小的 矩陣,并用fill 去填充 def make_matrix(m, n, fill = 0.0 ):mat = []for i in range(m):# 對行進行循環mat.append([fill] * n)#創建每行的列元素return mat #定義sigmoid 函數,及它的導數 def sigmoid(x):return 1.0 / (1.0 + math.exp(-x)) def sigmoid_derivate(x):return x * (1 - x) #定義BPNeuralNetwork類,使用三個列表維護輸入層,隱含層,輸出層神經元 class BPNeuralNetwork:def __init__(self):self.input_n = 0self.hidden_n = 0self.output_n = 0self.input_cells = []self.hidden_cells = []self.output_cells = []self.input_weights = []self.output_weights = []self.input_correction = []self.output_correction = [] #定義setup 的方法初始化神經網絡# ni ,nh ,no ->各層神經元的個數def setup(self, ni, nh, no):self.input_n = ni + 1 #輸入層額外加一個偏置神經元,提供一個可控的輸入修正;(或者為每個隱含層神經元設置一個偏置參數)self.hidden_n = nh #隱藏層神經元個數self.output_n = no #輸出層神經元個數#init cells#初始化神經元的輸出值self.input_cells = [1.0] * self.input_n #輸入層各神經元的值初始化為1self.hidden_cells = [1.0] * self.hidden_n#隱藏層神經元的值初始化為1self.output_cells = [1.0] * self.output_n#輸出層神經元的值初始化為1# init weights#初始化神經網絡各層權重的值 各層的權重已矩陣的形式存儲self.input_weights = make_matrix(self.input_n, self.hidden_n) #初始化輸入層與隱藏層間的權重 self.output_weights = make_matrix(self.hidden_n,self.output_n)#初始化隱藏層與輸出層間的權重#random activate#給權重矩陣 隨機賦初值for i in range(self.input_n):#給輸入層及隱藏層間的權重矩陣賦初值for h in range(self.hidden_n):self.input_weights[i][h] = rand(-0.2, 0.2)for h in range(self.hidden_n):#給隱藏層及輸出層間的權重賦初值for o in range(self.output_n):self.output_weights[h][o] = rand(-2.0, 2.0)#init correction matrix#創建矯正矩陣 此處應該是指各層權重矩陣的矯正矩陣self.input_correction = make_matrix(self.input_n, self.hidden_n) #輸入矯正矩陣self.output_correction = make_matrix(self.hidden_n, self.output_n)#輸出矯正矩陣#定義predict方法進行一次前饋,并返回輸出def predict(self,inputs):#activate input layer#激活輸入層for i in range(self.input_n - 1):self.input_cells[i] = inputs[i] #對輸入層神經元賦值 (此處不含輸入層神經元的偏置)#activate hidden layer#激活隱藏層for j in range(self.hidden_n):#對隱含層神經元進行計算求值total = 0.0for i in range(self.input_n):#前一層神經元的輸出 * 相應權重值 后求和total += self.input_cells[i] * self.input_weights[i][j] #self.hidden_cells[j] = sigmoid(total)#對每個神經元經過前一層的求和后 計算經過所選激勵函數映射后的輸出。#activate output layer#激活輸出層for k in range(self.output_n):#對輸出層各神經元的值進行計算total = 0.0for j in range(self.hidden_n):#隱藏層的輸出經過神經元的加權后求和total += self.hidden_cells[j] * self.output_weights[j][k]self.output_cells[k] = sigmoid(total)#所得和經過激勵函數的映射后的輸出return self.output_cells[:] #定義一次反向傳播 和更新權值的過程,并返回最終預測誤差def back_propagate(self, case, label, learn, correct):#feed forward ->前饋self.predict(case) #對實例case進行前饋預測#get output layer error ->獲取輸出層誤差 output_deltas = [0.0] * self.output_n #初始化輸出層更新差值列表#計算實際的標簽與預測標簽的差值進行計算for o in range(self.output_n):error = label[o] -self.output_cells[o]output_deltas[o] = sigmoid_derivate(self.output_cells[o]) * error#???#get hidden layer error ->獲取隱藏層的誤差列表hidden_deltas = [0.0] * self.hidden_n #初始化隱藏層更新差值列表for h in range(self.hidden_n):error = 0.0for o in range(self.output_n):error += output_deltas[o] * self.output_weights[h][o]hidden_deltas[h] = sigmoid_derivate(self.hidden_cells[h]) * error# update output weights 更新輸出層權重for h in range(self.hidden_n):for o in range(self.output_n):change = output_deltas[o] * self.hidden_cells[h]self.output_weights[h][o] += learn * change + correct + self.output_correction[h][o]self.output_correction[h][o] = change#update input weights 更新輸入層權重for i in range(self.input_n):for h in range(self.hidden_n):change = hidden_deltas[h] * self.input_cells[i]self.input_weights[i][h] += learn * change + correct *self.input_correction[i][h] #correct 為矯正矩陣的矯正率self.input_correction[i][h] = change #更新矯正矩陣#get global error 獲取全局誤差 error = 0.0for o in range(len(label)):error += 0.5 * (label[o] - self.output_cells[o]) ** 2return error#定義train方法控制迭代,該方法可以修改最大迭代次數,學習率 矯正率 三個參數def train(self, cases, labels, limit = 10000,learn = 0.05 , correct = 0.1):for i in range(limit):error = 0.0for i in range(len(cases)):label = labels[i]case = cases[i]error += self.back_propagate(case, label, learn, correct)#test 方法演示如何使用神經網絡學習異或邏輯 def test(self):cases = [[0, 0],[0, 1],[1, 0],[1, 1],]labels = [[0], [1], [1], [0]]self.setup(2, 5, 1) #初始化神經網絡self.train(cases, labels, 10000, 0.05, 0.1)#神經網絡的學習for case in cases: #對輸入進行分類預測print(self.predict(case))if __name__ == '__main__':nn = BPNeuralNetwork()nn.test()數據標準化: x_train, x_test, y_train, y_test = train_test_split(Input,output,test_size=0.2, random_state=0) #數據標準化——匿名函數max[x]-x/max[x]-min[x] x_train=x_train.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x))) y_train=y_train.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x))) 問題: 還沒有考慮預測結果反歸一結果:
總結
以上是生活随笔為你收集整理的神经网络-回归(Python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统 文件换行符问题
- 下一篇: python解压文件并检查_python