使用tensorflow实现机器学习中的线性拟合

使用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()  

 

猜你喜欢

转载自www.cnblogs.com/ace007/p/10720994.html
今日推荐