回归和分类的区别
回归:通过一堆数据,得出一个预测值
例如:通过一个人的特征分析,预测银行会贷款给我多少钱
分类:通过一堆数据,得出0或者1的值
例如:通过一个人的特征分析,预测银行会不会贷款给我
线性回归:通过一堆数据,得出一个预测值. 预测值和真实值存在一定的差异,这个差异叫做误差项.
若随机变量 服从一个均值为 、标准差为 (方差^2 )的概率分布,且其概率密度函数为 [2]
(注意上式中exp后面那部分是幂的关系,不是和exp相乘)则这个随机变量就称为正态(高斯)随机变量
exp 是以自然常数e(2.718282)为底的指数函数,EXP{2}是e的2次方.
似然函数是关于θ的函数而密度函数是关于x的函数
机器学习中线性回归目的:以误差项(有时候有可能不能直接求,可以通过变换得到一个新的函数)为目标函数(或者叫损失函数),通过学习使得所有训练集数据的误差项尽可能的趋于零.但是实际误差项在机器学习过程中无法迭代,所以转换为求其他函数.
偏导数 f'x(x0,y0) 表示固定面上一点对 x 轴的切线斜率;偏导数 f'y(x0,y0) 表示固定面上一点对 y 轴的切线斜率。
注意目标函数中的x和θ,不是一个数,也不是一个样本,而是一个样本中的数据特征和权重参数,是一个矩阵. 求最小值,即对θ求偏导,偏导为0.
线性回归:
求和与矩阵的转换,T表示转置
矩阵的上标表示样本序列,下标表示特征序列
线性回归实例
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt %matplotlib inline # 随机生成1000个点,围绕在y=0.1x+0.3的直线周围 num_points = 1000 vectors_set = [] for i in range(num_points): x1 = np.random.normal(0.0, 0.55) y1 = x1 * 0.1 + 0.3 + np.random.normal(0.0, 0.03) vectors_set.append([x1, y1]) # 生成一些样本 x_data = [v[0] for v in vectors_set] y_data = [v[1] for v in vectors_set] plt.scatter(x_data,y_data,c='r') plt.show()
In [12]:
# 生成1维的W矩阵,取值是[-1,1]之间的随机数 即权重参数 W = tf.Variable(tf.random_uniform([1], -1.0, 1.0), name='W') # 生成1维的b矩阵,初始值是0 即偏置项(误差项) b = tf.Variable(tf.zeros([1]), name='b') # 经过计算得出预估值y y = W * x_data + b # 以预估值y和实际值y_data之间的均方误差作为损失 loss = tf.reduce_mean(tf.square(y - y_data), name='loss') # 采用梯度下降法来优化参数 optimizer = tf.train.GradientDescentOptimizer(0.5)#0.5为学习率 # 训练的过程就是最小化这个误差值 train = optimizer.minimize(loss, name='train') sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) # 初始化的W和b是多少 print("W =",sess.run(W),"b =", "lossess.run(b)s =", sess.run(loss)) # 执行20次训练 for step in range(20): sess.run(train) # 输出训练好的W和b print ("W =", sess.run(W), "b =", sess.run(b), "loss =", sess.run(loss)) #writer = tf.train.SummaryWriter("./tmp", sess.graph)
W = [-0.98704934] b = lossess.run(b)s = 0.47451138 W = [-0.64456743] b = [0.335968] loss = 0.17037457 W = [-0.41769895] b = [0.32486618] loss = 0.082887545 W = [-0.25984156] b = [0.3175121] loss = 0.040539894 W = [-0.1500148] b = [0.312395] loss = 0.02004169 W = [-0.07360455] b = [0.3088349] loss = 0.01011961 W = [-0.02044334] b = [0.306358] loss = 0.005316868 W = [0.01654273] b = [0.30463475] loss = 0.0029921203 W = [0.0422752] b = [0.30343583] loss = 0.0018668352 W = [0.06017816] b = [0.3026017] loss = 0.0013221455 W = [0.07263386] b = [0.30202135] loss = 0.0010584904 W = [0.08129972] b = [0.3016176] loss = 0.0009308692 W = [0.08732886] b = [0.30133668] loss = 0.0008690946 W = [0.09152354] b = [0.30114126] loss = 0.0008391929 W = [0.09444191] b = [0.30100527] loss = 0.000824719 W = [0.09647233] b = [0.30091068] loss = 0.0008177131 W = [0.09788496] b = [0.30084485] loss = 0.00081432174 W = [0.09886777] b = [0.30079907] loss = 0.0008126802 W = [0.09955155] b = [0.3007672] loss = 0.00081188575 W = [0.10002728] b = [0.30074504] loss = 0.00081150123 W = [0.10035826] b = [0.30072963] loss = 0.0008113151
In [13]:
plt.scatter(x_data,y_data,c='r')
plt.plot(x_data,sess.run(W)*x_data+sess.run(b))
plt.show()
逻辑回归:是经典的二分类算法
对于一个变量或者说函数A,带入另一个函数B,那么以A为自变量带入B之后,输出就会具有B的特征,比如把预测值带入sigmoid函数,那么它的输出在有限的计算中取值为0<g(z)<1,实际计算取不到0和1
对于训练数据的单个样本来说,y的取值是0或者1,是已知的,并且只取其中一个值,相当于把样本的真实值引入似然函数及后面的损失函数计算,最终目标是损失越小越好.