1. 程式人生 > >使用tensorflow實現機器學習中的線性擬合

使用tensorflow實現機器學習中的線性擬合

esc 需要 機器 ima variable minus numpy bubuko otl

使用tensorflow實現機器學習中的線性擬合
這個例子是模擬的單變量線性回歸,通過提高單變量的階數來增加特征數量,例如:4階相當於分解為四個特征
這種思想同樣適用於多變量線性回歸

        import tensorflow as tf
        import numpy as np
        import matplotlib.pyplot as plt
        plt.rcParams[‘font.sans-serif‘]=[‘FangSong‘] # 用來正常顯示中文標簽
        plt.rcParams[‘axes.unicode_minus‘]=False# 用來正常顯示負號
        plt.title(‘四階多項式擬合‘)        
        
        #數據準備
        n_samples =100
        #數據集
        X = np.linspace(-3, 3, n_samples)
        #數據集標簽,需要擬合的結果
        Y = np.sin(X) + np.random.uniform(0,1,n_samples)
        
        #靜態圖定義
        mg = tf.Graph()
        with mg.as_default():
            #占位
            xs = tf.placeholder(dtype=tf.float32,name=‘xs‘)
            ys = tf.placeholder(dtype=tf.float32,name=‘ys‘)
             
            #需要訓練的權重變量
            w1 = tf.Variable(tf.random_normal([1]),name=‘w1‘)
            w2 = tf.Variable(tf.random_normal([1]),name=‘w2‘)
            w3 = tf.Variable(tf.random_normal([1]),name=‘w3‘)
            w4 = tf.Variable(tf.random_normal([1]),name=‘w4‘)
            b = tf.Variable(tf.zeros(1),name=‘b‘)
            
            #多項式公式
            my_pred = []
            my_pred.append(tf.multiply(w1,xs)) 
            my_pred.append(tf.multiply(w2,tf.pow(xs,2)))
            my_pred.append(tf.multiply(w3,tf.pow(xs,3)))
            my_pred.append(tf.multiply(w4,tf.pow(xs,4)))
            y_pred = tf.add(tf.add_n(my_pred), b)
                        
            #損失函數:使用樣本方差
            loss = tf.reduce_sum(tf.pow(y_pred-ys, 2)) / (len(X)-1)

            #學習率,其實就是用多大的步進持續學習
            lr = 0.01
            #學習的輪數
            epochs = 1000
            #使用梯度下降法優化
            optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
        
        with tf.Session(graph=mg) as sess:
            sess.run(tf.global_variables_initializer())
            for epoch in range(epochs):
                total_loss = 0
                for x,y in zip(X,Y):
                    _,tmp_loss = sess.run([optimizer,loss],feed_dict={xs:x,ys:y})
                    total_loss += tmp_loss
                if epoch%10 == 0:
                    print(‘epoch{:} the loss {:}‘.format(epoch,total_loss))
            #獲取系統優化結果
            mgw1,mgw2,mgw3,mgw4,mgb = sess.run([w1,w2,w3,w4,b])
        #session中的變量自動轉換為全局變量
        print(mgw1,mgw2,mgw3,mgw4,mgb)
        #最終的擬合函數
        YY= X*mgw1 + X**2*mgw2 + X**3*mgw3 + X**4*mgw4 + mgb
        plt.plot(X, Y, ‘bo‘, label=‘原始數據‘)
        plt.plot(X, YY, ‘r‘, label=‘擬合數據‘)
        plt.legend()
        plt.show()  

技術分享圖片

使用tensorflow實現機器學習中的線性擬合