## **1.0 线性回归Linear Regression** fw,b(x)=∑iwixi+b 各个feature的 `Xi` 对应的权重 `Wi` 相乘并求和, 再最后加上b, 不通过Sigmod函数计算, 输出值是任意范围的值。 - **误差估计** ŷ n: 代表数据真实值 , f(xn) 代表预测值, 12∑ni=1(预测结果i−实际结果i)2 使用均方误差用来衡量, 有着很好地几何特性,和二范数一样。 前面乘上的1/2是为了在求导的时候,这个系数就不见了。 ## **1.1 逻辑回归 Logistic Regression** - 线性 z=∑iwixi+b 通过 Sigmod 函数 σ(z) 转为非线性 logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数 σ(z) 将最为假设函数来预测。 σ(z) 可以将连续值映射到0和1上。 fw,b(x)=σ(∑iwixi+b) 上面公式在线性回归的基础上, 将线性回归的结果带入Sigmod函数中, 得到的结果介于 0 到 1 之间。 Pw,b(C1|x)=σ(z),σ(z)=11+exp(−z),z=w∗x+b=∑iwixi+b 将 z 带入Sigmod函数——> σ(z) 得到概率大小。 fw,b(x)=Pw,b(C1|x) 表示在Sigmod函数的映射下 , C1 的概率大小。 从该式可以看出, 最后 fw,b(x) 的结果受到 w、b 两个参数的控制, 可以选择不同的 w 和 b 得到不同的Function,计算出C1的概率。 - **损失函数** 误差公式: L(w,b)=fw,b(x1)fw,b(x2)∗∗∗fw,b(xn) 每个 xi 对应的概率 fw,b=(xi) 连续相乘, 其中 W∗,b∗ 就是能够是的 L(w,b) 最大化的一组值。 w⋆,b⋆=argmaxw,bL(w,b)=w⋆,b⋆=argmin−lnL(w,b) 等式右边的 −log 以 e 为底的对数形式的好处就是相乘变成现在相加 即: −lnL(w,b)=−lnfw,b(x1)−lnfw,b(x2)+...+(−lnfw,b(xn)) [【伯努利分布】](https://baike.baidu.com/item/%E4%BC%AF%E5%8A%AA%E5%88%A9%E5%88%86%E5%B8%83/7167021?fr=aladdin) 如果 ŷ n = 0 or 1 , 即满足伯努利分布 伯努利分布亦称“零一分布”、“两点分布”。称随机变量X有伯努利分布, 参数为p(0【数据极客】任务总结_Week2
http://blog.csdn.net/mao_xiao_feng/article/details/53048213
这三个都是非线性激励函数, 为什么引入非线性激励函数?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)。
正因为上面的原因,决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入。
激活函数(Activation Function)的特点:
输出值范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的学习率。
Sigmod
图像:
优点: 可将任意值变换到01区间, 可做概率; 它还是便于求导的平滑函数,其导数为 σ(x)(1−σ(x))
tf.sigmoid(x, name=None)
Tanh
图片:
优点:
tanh读作Hyperbolic Tangent,如上图所示,tanh 是0均值的, 它解决了不是零均值的输出问题,。因此,实际应用中,tanh 会比 sigmoid 更好。
缺点:
梯度消失的问题和幂运算的问题仍然存在。
tf函数 tf.tanh(x, name=None)
ReLU
数学公式: ReLU=f(x)=max(0,x)
tf.nn.relu(features, name=None)
二维数据的时候:
从图左可以看出,输入信号<0时,输出都是0,>0 的情况下,输出等于输入。w 是二维的情况下,使用ReLU之后的效果如下:
优点
缺点
tf函数 tf.nn.relu(features, name=None)
softmax
softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,输出结果(概率)和为1, 可以看成概率来理解,从而来进行多分类!
cross_entropy
交叉熵,信息学理论中的概念,用来衡量两个分布之间的相似程度,值越小,越相似。当两者一样时,熵为0。
softmax 和 sigmod的区别
sigmoid将一个real value映射到(0,1)的区间(当然也可以是(-1,1)),这样可以用来做二分类。
softmax把一个k维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中bi是一个0-1的常数,然后可以根据bi的大小来进行多分类的任务,如取权重最大的一维。
tf.placeholder()
Session.run
的函数的 feed_dict
参数指定tf.constant()
tf.Variable()
一个TensorFlow的运算,被表示为一个数据流的图。一幅图中包含一些操作(Operation)对象,这些对象是计算节点。Tensor对象,则是表示在不同的操作(operation)间的数据节点。
## 2.6 tf.name_scope()和tf.variable_scope()的理解? - tf.name_scope(name, default_name=None, values=None) 主要结合 tf.Variable() 来使用,方便参数命名管理。 - tf.variable_scope() 主要结合 tf.get_variable() 来使用,实现 变量共享。 先通过tf.variable_scope生成一个上下文管理器,并指明需求的变量在这个上下文管理器中,就可以直接通过tf.get_variable获取已经生成的变量。 >我觉得这个相当于指定一个命名空间。#通过tf.variable_scope函数控制tf.get_variable函数来获取以及创建过的变量
with tf.variable_scope("ttf"):#ttf的命名空间
v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0)) #在ttf的命名空间内创建名字为v的变量
在上下文管理器中已经生成一个v的变量,若想通过tf.get_variable函数获取其变量,则可以通过reuse参数的设定为True来获取, 重用。
with tf.variable_scope("ttf",reuse=True):
v1=tf.get_variable("v",[1])
print(v==v1) #输出为True
tf.variable_scope()
tf.get_variable()
tf.get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None, trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True, use_resource=None, custom_getter=None)
Gets an existing variable with these parameters or create a new one.
获取或者创建变量。
当tf.get_variable用于创建变量时,则与tf.Variable的功能基本相同。
#定义的基本等价
v = tf.get_variable("v",shape=[1],initializer.constant_initializer(1.0))
v = tf.Variable(tf.constant(1.0,shape=[1]),name="v")
- 相同点:通过两函数创建变量的过程基本一样,且tf.variable函数调用时提供的维度(shape)信息以及初始化方法(initializer)的参数和tf.Variable函数调用时提供的初始化过程中的参数基本类似。 - 不同点:两函数指定变量名称的参数不同,对于tf.Variable函数,变量名称是一个可选的参数,通过name=”v”的形式给出,而tf.get_variable函数,变量名称是一个必填的参数,它会根据变量名称去创建或者获取变量。
使用tf.global_variables_initializer()函数初始化所有可变张量的状态。
第四周的作业都出来, 吓得一条, 赶紧把第二周的实践作业完成了。
# -*- coding: utf-8 -*-
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import Series,DataFrame
from sklearn.model_selection import train_test_split
data_train = pd.read_csv("./input/train.csv", header=0)
data_train.columns
Index([‘PassengerId’, ‘Survived’, ‘Pclass’, ‘Name’, ‘Sex’, ‘Age’, ‘SibSp’, ‘Parch’, ‘Ticket’, ‘Fare’, ‘Cabin’, ‘Embarked’], dtype=’object’) PassengerId => 乘客ID
data_train.Sex.value_counts()
male 577 female 314 Name: Sex, dtype: int64
# 计算平均年龄
mean_age = int(data_train["Age"].mean())
mean_age
29
data_train2 = data_train
#将年龄为空的记录 用平均年龄填充
data_train2.loc[(data_train2.Age.isnull()), 'Age' ] = mean_age
# 有舱位的数据用Yes填充, 没有的用No
def setCabinType(df):
df.loc[ (df.Cabin.notnull()), 'Cabin' ] = "Yes"
df.loc[ (df.Cabin.isnull()), 'Cabin' ] = "No"
return df
data_train2 = setCabinType(data_train2)
data_train2.head(5)
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | No | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th… | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | Yes | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | No | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | Yes | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | No | S |
#特征离散化
dummies_Sex = pd.get_dummies(data_train2['Sex'], prefix= 'Sex')
dummies_Pclass = pd.get_dummies(data_train2['Pclass'], prefix= 'Pclass')
dummies_Cabin = pd.get_dummies(data_train2['Cabin'], prefix= 'Cabin')
dummies_Embarked = pd.get_dummies(data_train2['Embarked'], prefix= 'Embarked')
df = pd.concat([data_train, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True)
df.head(5)
PassengerId | Survived | Age | SibSp | Parch | Fare | Cabin_No | Cabin_Yes | Embarked_C | Embarked_Q | Embarked_S | Sex_female | Sex_male | Pclass_1 | Pclass_2 | Pclass_3 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 22.0 | 1 | 0 | 7.2500 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
1 | 2 | 1 | 38.0 | 1 | 0 | 71.2833 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
2 | 3 | 1 | 26.0 | 0 | 0 | 7.9250 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
3 | 4 | 1 | 35.0 | 1 | 0 | 53.1000 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
4 | 5 | 0 | 35.0 | 0 | 0 | 8.0500 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
train_df = df.filter(regex='Survived|Age_.*|Sex_.*|Pclass_.*')
train_np = train_df.as_matrix()
label = train_np[:, 0]
label=label.reshape((891,1))
print(label.shape)
input= train_np[:, 1:]
print(input.shape)
(891, 1)
(891, 5)
learning_rate = 0.5
seed = 0;
X_train, X_val, y_train, y_val = train_test_split(
input, label, test_size = 0.2, random_state = seed)
print(X_train.shape)
print(X_val.shape)
print(y_train.shape)
print(y_val.shape)
# 训练数据
X = tf.placeholder(tf.float32, shape=[None, 5], name='input')
y = tf.placeholder(tf.float32, shape=[None, 1], name='label')
# 声明参数权重变量
W = tf.Variable(tf.random_normal([5, 1]), name='weights')
b = tf.Variable(tf.zeros([1]), name='bias')
# softmax逻辑回归
y_pred = tf.nn.softmax(tf.matmul(X, W) + b)
# 损失函数:交叉熵
cross_entropy = - tf.reduce_sum(y * tf.log(y_pred + 1e-10), reduction_indices=1)
# 计算交叉熵的平均值
cost = tf.reduce_mean(cross_entropy)
# 使用SDG最小化代价cost函数
train_op = tf.train.GradientDescentOptimizer(0.5).minimize(cost)
# 保存训练模型
saver = tf.train.Saver()
with tf.Session() as sess:
tf.global_variables_initializer().run()
for epoch in range(100):
total_loss = 0.0
for i in range(len(X_train)):
feed = {X: [X_train[i]], y: [y_train[i]]}
_, loss = sess.run([train_op, cost], feed_dict=feed)
total_loss += loss
if (epoch % 10 == 0):
print('Epoch: %04d, total loss=%.9f' % (epoch + 1, total_loss))
print('Training complete!')
# 用验证集评估模型的准确率
pred_val = sess.run(y_pred, feed_dict={X: X_val})
correct = np.equal(np.argmax(pred_val, 1), np.argmax(y_val, 1))
accuracy = np.mean(correct.astype(np.float32))
print('accuracy on validation set:%.9f' % accuracy)
saver.save(sess, "Model/model_ema.ckpt")
sess.close()
(712, 5)
(179, 5)
(712, 1)
(179, 1)
Epoch: 0001, total loss=0.000000000
Epoch: 0011, total loss=0.000000000
Epoch: 0021, total loss=0.000000000
Epoch: 0031, total loss=0.000000000
Epoch: 0041, total loss=0.000000000
Epoch: 0051, total loss=0.000000000
Epoch: 0061, total loss=0.000000000
Epoch: 0071, total loss=0.000000000
Epoch: 0081, total loss=0.000000000
Epoch: 0091, total loss=0.000000000
Training complete!
accuracy on validation set:1.000000000
http://blog.csdn.net/hsj1213522415/article/details/70674197?locationNum=9&fps=1
https://www.zhihu.com/question/29021768
https://zhuanlan.zhihu.com/p/25110450
https://www.zhihu.com/question/23765351
https://zh.wikipedia.org/wiki/Softmax%E5%87%BD%E6%95%B0
http://blog.csdn.net/sinat_32329183/article/details/77835677
http://blog.csdn.net/lanchunhui/article/details/61712830