python版本–3.6 ; Tensorflow版本–1.15.0 ;编辑器–Pycharm
以iris数据集的除Sepal length的数据作为X, 以Sepal length作为Y, 用X去拟合Y;
前面已经很详细介绍过了, 这里直接看代码
import matplotlib.pyplot as plt # 画图库
import tensorflow as tf
import numpy as np #矩阵库
from sklearn import datasets #导入数据集
from tensorflow.python.framework import ops #Loss函数优化器
ops.get_default_graph()
sess = tf.Session()
iris = datasets.load_iris()
X = np.array([x[1:4] for x in iris.data])
Y = np.array([y[0] for y in iris.data])
# 声明学习率, 批量大小, 占位符和模型变量
seed = 42
tf.set_random_seed(seed)
learning_rate = 0.01
batch_size = 25
x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
W = tf.Variable(tf.random_normal(shape=[3, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))
# 增加线性模型
model_output = tf.add(tf.matmul(x_data, W), b)
# 声明损失函数 MSE+L2, 其为批量损失的平均值, 初始化变量, 声明优化器
L2_regularization_param = tf.reduce_mean(tf.square(W)) # L2正则项
loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target - model_output)), L2_regularization_param), 0) # MSE+L2
# `tf.square` 表示向量的平方 `tf.reduce_mean` 表示计算张量在指定维度上的平均值, 如果没有指定就是普通的算平均值
init = tf.global_variables_initializer() # 表示初始化操作
my_opt = tf.train.GradientDescentOptimizer(learning_rate) # 表示选择梯度下降法作为优化器
train_step = my_opt.minimize(loss) # 最小化Loss损失
sess.run(init) # 运行初始化操作
# 迭代遍历, 并在随机选择的数据上进行模型训练, 迭代100次 每25次迭代输出变量值和损失值, 将其用于之后的可视化
loss_vec = [] # 储存loss随迭代次数的变化, 等一下用于画图
for i in range(100):
rand_index = np.random.choice(len(X), size=batch_size) # 随机挑选X, 用于小批量随机梯度下降
rand_x = X[rand_index]
rand_y = np.transpose([Y[rand_index]])
# 目标:最优化损失
sess.run(train_step, feed_dict={x_data:rand_x,
y_target:rand_y})
# 更新loss值
temp_loss = sess.run(loss, feed_dict={x_data:rand_x,
y_target:rand_y})
loss_vec.append(temp_loss)
# 每25次打印
if (i+1) % 25 == 0:
print('Step:', i+1, 'w为:', sess.run(W), 'b为:', sess.run(b)[0][0])
print('Loss为:', temp_loss)
# 抽取系数, 创建最佳拟合直线
slope = sess.run(W)[0][0]
y_intercept = sess.run(b)[0][0]
best_fit = []
for i in X:
best_fit.append(slope * i + y_intercept)
# 绘制两幅图 第一个是拟合直线(高维空间的画图就不画了) 另一个是迭代100次的L2正则损失
plt.figure(2)
plt.plot(loss_vec, 'k--')
plt.title('Ridge loss per Generation')
plt.xlabel('Generation')
plt.ylabel('loss')
plt.show()
以iris数据集的除Sepal length的数据作为X, 以Sepal length作为Y, 用X去拟合Y;
import matplotlib.pyplot as plt # 画图库
import tensorflow as tf
import numpy as np #矩阵库
from sklearn import datasets #导入数据集
from tensorflow.python.framework import ops #Loss函数优化器
ops.get_default_graph()
sess = tf.Session()
iris = datasets.load_iris()
X = np.array([x[1:4] for x in iris.data])
Y = np.array([y[0] for y in iris.data])
# 声明学习率, 批量大小, 占位符和模型变量
seed = 42
tf.set_random_seed(seed)
learning_rate = 0.01
batch_size = 25
x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
W = tf.Variable(tf.random_normal(shape=[3, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))
# 增加线性模型
model_output = tf.add(tf.matmul(x_data, W), b)
# 声明损失函数 MSE+L2, 其为批量损失的平均值, 初始化变量, 声明优化器
L1_regularization_param = tf.reduce_mean(tf.abs(W)) # L1正则项
loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target - model_output)), L1_regularization_param), 0) # MSE+L1
# `tf.square` 表示向量的平方 `tf.reduce_mean` 表示计算张量在指定维度上的平均值, 如果没有指定就是普通的算平均值
init = tf.global_variables_initializer() # 表示初始化操作
my_opt = tf.train.GradientDescentOptimizer(learning_rate) # 表示选择梯度下降法作为优化器
train_step = my_opt.minimize(loss) # 最小化Loss损失
sess.run(init) # 运行初始化操作
# 迭代遍历, 并在随机选择的数据上进行模型训练, 迭代100次 每25次迭代输出变量值和损失值, 将其用于之后的可视化
loss_vec = [] # 储存loss随迭代次数的变化, 等一下用于画图
for i in range(100):
rand_index = np.random.choice(len(X), size=batch_size) # 随机挑选X, 用于小批量随机梯度下降
rand_x = X[rand_index]
rand_y = np.transpose([Y[rand_index]])
# 目标:最优化损失
sess.run(train_step, feed_dict={x_data:rand_x,
y_target:rand_y})
# 更新loss值
temp_loss = sess.run(loss, feed_dict={x_data:rand_x,
y_target:rand_y})
loss_vec.append(temp_loss)
# 每25次打印
if (i+1) % 25 == 0:
print('Step:', i+1, 'w为:', sess.run(W), 'b为:', sess.run(b)[0][0])
print('Loss为:', temp_loss)
# 抽取系数, 创建最佳拟合直线
slope = sess.run(W)[0][0]
y_intercept = sess.run(b)[0][0]
best_fit = []
for i in X:
best_fit.append(slope * i + y_intercept)
# 绘制两幅图 第一个是拟合直线(高维空间的画图就不画了) 另一个是迭代100次的L2正则损失
plt.figure(2)
plt.plot(loss_vec, 'k--')
plt.title('Lasso loss per Generation')
plt.xlabel('Generation')
plt.ylabel('loss')
plt.show()
还记得吗? ElasticNet是即用L1也用L2
以iris数据集的除Sepal length的数据作为X, 以Sepal length作为Y, 用X去拟合Y;
import matplotlib.pyplot as plt # 画图库
import tensorflow as tf
import numpy as np #矩阵库
from sklearn import datasets #导入数据集
from tensorflow.python.framework import ops #Loss函数优化器
ops.get_default_graph()
sess = tf.Session()
iris = datasets.load_iris()
X = np.array([x[1:4] for x in iris.data])
Y = np.array([y[0] for y in iris.data])
# 声明学习率, 批量大小, 占位符和模型变量
seed = 42
tf.set_random_seed(seed)
learning_rate = 0.01
batch_size = 25
x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
W = tf.Variable(tf.random_normal(shape=[3, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))
# 增加线性模型
model_output = tf.add(tf.matmul(x_data, W), b)
# 声明损失函数 MSE+L2, 其为批量损失的平均值, 初始化变量, 声明优化器
L1_regularization_param = tf.reduce_mean(tf.abs(W)) # L1正则项
L2_regularization_param = tf.reduce_mean(tf.square(W)) # L2正则项
regularization_param = tf.add(L1_regularization_param, L2_regularization_param) # L1 + L2
loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target - model_output)), regularization_param), 0) # MSE+ L1 + L2
# `tf.square` 表示向量的平方 `tf.reduce_mean` 表示计算张量在指定维度上的平均值, 如果没有指定就是普通的算平均值
init = tf.global_variables_initializer() # 表示初始化操作
my_opt = tf.train.GradientDescentOptimizer(learning_rate) # 表示选择梯度下降法作为优化器
train_step = my_opt.minimize(loss) # 最小化Loss损失
sess.run(init) # 运行初始化操作
# 迭代遍历, 并在随机选择的数据上进行模型训练, 迭代100次 每25次迭代输出变量值和损失值, 将其用于之后的可视化
loss_vec = [] # 储存loss随迭代次数的变化, 等一下用于画图
for i in range(100):
rand_index = np.random.choice(len(X), size=batch_size) # 随机挑选X, 用于小批量随机梯度下降
rand_x = X[rand_index]
rand_y = np.transpose([Y[rand_index]])
# 目标:最优化损失
sess.run(train_step, feed_dict={x_data:rand_x,
y_target:rand_y})
# 更新loss值
temp_loss = sess.run(loss, feed_dict={x_data:rand_x,
y_target:rand_y})
loss_vec.append(temp_loss)
# 每25次打印
if (i+1) % 25 == 0:
print('Step:', i+1, 'w为:', sess.run(W), 'b为:', sess.run(b)[0][0])
print('Loss为:', temp_loss)
# 抽取系数, 创建最佳拟合直线
slope = sess.run(W)[0][0]
y_intercept = sess.run(b)[0][0]
best_fit = []
for i in X:
best_fit.append(slope * i + y_intercept)
# 绘制两幅图 第一个是拟合直线(高维空间的画图就不画了) 另一个是迭代100次的L2正则损失
plt.figure(2)
plt.plot(loss_vec, 'k--')
plt.title('ElasticNet loss per Generation')
plt.xlabel('Generation')
plt.ylabel('loss')
plt.show()
Ridge和Lasso回归代码实现–Tensorflow部分就是这样了, 继续下一章吧!pd的Machine Learning