机器学习笔记 -吴恩达(第六章:线性回归,tensorflow实现 附源码)

该博客介绍了如何使用TensorFlow进行线性回归,包括数据预处理、模型定义、训练过程以及不同优化器的效果对比。通过加载数据,绘制数据分布,然后对特征进行标准化处理。接着,定义了线性回归模型,设置了损失函数,并使用不同优化器进行训练,记录并展示了每个优化器的损失变化。最后,绘制了不同优化器在训练过程中的损失曲线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)数据概览

import pandas as pd
import seaborn as sns
sns.set(context="notebook", style="whitegrid", palette="dark")
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np

raw_data = pd.read_csv('ex1data2.txt', names=['square', 'bedrooms', 'price'])
raw_data.head()

(2)绘图观察数据

 

(3)数据预处理

def get_X(df):#读取特征
    ones = pd.DataFrame({'ones': np.ones(len(df))})#ones是m行1列的dataframe
    data = pd.concat([ones, df], axis=1)  # 合并数据,根据列合并
    return data.iloc[:, :-1].as_matrix()  # 这个操作返回 ndarray,转为二维矩阵

def get_y(df):#读取标签
    #  '''iloc选取列数据,选取所有行数据,只要最后一列,'''
    return np.array(df.iloc[:, -1])#df.iloc[:, -1]是指df的最后一列

def normalize_feature(df):
    # """Applies function along input axis(default 0) of DataFrame."""
    return df.apply(lambda column: (column - column.mean()) / column.std())#特征缩放

data = normalize_feature(raw_data)
data.head()

(4)模型

# X_data 为特征集,y_data为目标集,alpha 为学习率,epoch 为迭代次数,optimizer为梯度下降算法
def linear_regression(X_data, y_data, alpha, epoch, optimizer=tf.train.GradientDescentOptimizer):
      # placeholder for graph input
    X = tf.placeholder(tf.float32, shape=X_data.shape)
    y = tf.placeholder(tf.float32, shape=y_data.shape)

    # 设计计算图
    with tf.variable_scope('linear-regression'):

        #初始化参数矩阵 2*1
        W = tf.get_variable("weights", (X_data.shape[1], 1),initializer=tf.constant_initializer())  # n*1
        #矩阵乘法
        y_pred = tf.matmul(X, W)  # m*n @ n*1 -> m*1
        #损失函数,a.T @ a  ,相当于求平方
        loss = 1 / (2 * len(X_data)) * tf.matmul((y_pred - y), (y_pred - y), transpose_a=True)  # (m*1).T @ m*1 = 1*1

         #设置学习率,使用梯度下降算法,优化损失函数loss
    opt_operation = optimizer(learning_rate=alpha).minimize(loss)
   

    # 开始训练
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

         #存放损失值列表
        loss_data = []

        for i in range(epoch):
            _, loss_val, W_val = sess.run([opt_operation, loss, W], feed_dict={X: X_data, y: y_data})
            loss_data.append(loss_val[0, 0])  # because every loss_val is 1*1 ndarray

            if len(loss_data) > 1 and np.abs(loss_data[-1] - loss_data[-2]) < 10 ** -9:  # early break when it's converged
                # print('Converged at epoch {}'.format(i))
                break

    # clear the graph
    tf.reset_default_graph()
    return {'loss': loss_data, 'parameters': W_val}  

(5) 开始训练

X_data = get_X(data)
print (X_data)
print(X_data.shape, type(X_data))

y_data = get_y(data).reshape(len(X_data), 1)  # special treatment for tensorflow input data
print (y_data)
print(y_data.shape, type(y_data))

epoch = 2000
alpha = 0.01

optimizer_dict={'GD': tf.train.GradientDescentOptimizer,
                'Adagrad': tf.train.AdagradOptimizer,
                'Adam': tf.train.AdamOptimizer,
                'Ftrl': tf.train.FtrlOptimizer,
                'RMS': tf.train.RMSPropOptimizer
               }
results = []
for name in optimizer_dict:
    res = linear_regression(X_data, y_data, alpha, epoch, optimizer=optimizer_dict[name])
    res['name'] = name
    results.append(res)

 

(6)绘图

fig, ax = plt.subplots(figsize=(16, 9))

for res in results: 
    parameters = res['parameters']
    print (parameters)
    loss_data = res['loss']
    ax.plot(np.arange(len(loss_data)), loss_data, label=res['name'])

ax.set_xlabel('epoch', fontsize=18)
ax.set_ylabel('cost', fontsize=18)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
ax.set_title('different optimizer', fontsize=18)
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值