机器学习实战第二版---第三节:回归

回归---线性回归、全局(批量)回归、随机回归、小批量回归

线性回归

线性回归类似一次函数去逼近w0,w1

##用轮子
lin_reg = LinearRegression()
lin_reg.fit(x, y)
#输出线性回归的截距和各个系数
print('截距',lin_reg.intercept_)  #intercept_ 偏 差 项
print('各个系数',lin_reg.coef_)#特 征 权 重(coef_)

#评价手段
#最小二乘法
theta_best_svd, residuals, rank, s = np.linalg.lstsq(x_b, y, rcond=1e-6)#最小二乘法  LinearRegression类基于scipy.linalg.lstsq()函数(名称代表“最小二乘”)
print('二乘法',theta_best_svd) #表示每个w的误差
#svd 奇异值分解评价
print('奇异值',np.linalg.pinv(x_b).dot(y))#dot计算矩阵的内积  你可以使用np.linalg.pinv()来直接计算这个伪逆





'''
线性回归源码
'''


x=2*np.random.rand(100,1)#生成[0,1)之间的数据 100行1列
y=4+3*x+np.random.rand(100,1)  #有个高斯噪声
x_b = np.c_[np.ones((100,1)),x]#按列合并
'''
# plt.plot(x,y,'.')
# plt.show()

x_b = np.c_[np.ones((100,1)),x]#按列合并
# print(x_b.shape)
theta_best = np.linalg.inv(x_b.T.dot(x_b)).dot(x_b.T).dot(y)

'''
# 使用NumPy的线性代数模块
# (np.linalg)中的inv()函数来对矩阵求逆,并用dot()方法计算
# 矩阵的内积
# 实际用来生成数据的函数是y=4+3x1+高斯噪声
'''
'''
'''
print(theta_best)
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new] # add x0 = 1 to each instance
y_predict = X_new_b.dot(theta_best)
print(y_predict)

plt.plot(X_new, y_predict, "r-")
plt.plot(x, y, "b.")
plt.axis([0, 2, 0, 15])
plt.show()
'''

批量回归

#如何选择学习率------------网格搜索,但是需要限制迭代次数,这样网格搜索可以淘汰掉那些收敛耗时太长的模型。
‘’’
梯度下降:通过迭代调整参数从而使得成本函数最小
通过测量向量t相关的误差函数的局部梯度,并不断沿着降低梯度的方向调整,直到梯度为0,降低为最小值
由于使用成本函数mems 是个 凸函数,不管怎么下降梯度都会到达全局最小点,避免了局部最小,只不过是时间快慢问题,有特征缩放时间快一点,没有就慢一点
‘’’
‘’’
批量梯度下降==全局梯度下降,使用全部的训练集去搞梯度下降
‘’’

eta = 0.1 # learning rate
n_iterations = 1000
m = 100
theta = np.random.randn(2,1) # random initialization 2行一列
for iteration in range(n_iterations):
    gradients = 2 / m * x_b.T.dot(x_b.dot(theta) - y)#他是使用全部训练集的对于theata去梯度,theta迭代
    theta = theta - eta * gradients
else:
    print('goodtheta',theta)

#如何选择学习率------------网格搜索,但是需要限制迭代次数,这样网格搜索可以淘汰掉那些收敛耗时太长的模型。

随机回归

‘’’
注意:SGD和线性梯度下降最大的区别在于:线性梯度下降每次计算成本函数时,是使用全部训练集的
随机梯度下降:每一步在训练集中随机选择一个实例,并且仅基于该单个实例来计
算梯度。它也可以被用来训练海量的数据集,因为每次迭代只需要在内
存中运行一个实例即可;成本函数将不再是缓缓降低直到抵达最小值,而是不断上上下下随着时间的推移,最终会非常接近
最小值,但是即使它到达了最小值,依旧还会持续反弹,永远不会停止
所以算法停下来的参数值肯定是足够好的,但不是最优
的。随机梯度下降其实可以帮
助算法跳出局部最小值,所以相比批量梯度下降,它对找到全局最小值
更有优势。

‘’’
‘’’
模拟退火:
开始的步长比较大(这有助于快速进展和逃离局部最小值),然后越来越小,让算法尽量靠近全局最小值。
‘’’

#学习率调整:
n_epochs = 50 #50轮
t0, t1 = 5, 50 # learning schedule hyperparameters
def learning_schedule(t):
    return t0 / (t + t1)

theta = np.random.randn(2,1) # random initialization 0-1的2行1列
for epoch in range(n_epochs):#50论
    for i in range(m):#每次学习的实例对象
        random_index = np.random.randint(m)#返回0-100随机整数,范围区间为[low,high),包含low,不包含high high没有填写时,默认生成随机数的范围是[0,low)
        xi = x_b[random_index:random_index + 1] #取每次实例的对象,并且是随机取
        yi = y[random_index:random_index + 1]
        gradients = 2 * xi.T.dot(xi.dot(theta) - yi)
        eta = learning_schedule(epoch * m + i) #学习率是不断减小
        theta = theta - eta * gradients

print('suijitheta', theta)
'''
注意:使用随机梯度下降,训练实例必须独立且均匀分布,以确保平均而言将参数拉向全局最优值----直接对数据进行混洗(使用SGD前)
'''
#用轮子--
'''
以下代码最多可运行1000个轮次,或者直到一个轮次期间损失下降小于0.001为止
(max_iter=1000,tol=1e-3)。它使用默认的学习调度(与前一个学习调度不同)以0.1(eta0=0.1)的学习率开始。最后,它不使用任何正则化
'''
sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, penalty=None, eta0=0.1)
sgd_reg.fit(x, y.ravel())
print('SGD:',sgd_reg.intercept_,sgd_reg.coef_)


'''
小批量梯度下降:在小型批量的随机实例集上计算梯度,优于随机梯度下降主要表现在可以通过矩阵优化提高性能,特别在使用GPU
'''

全部代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import SGDRegressor

'''
线性回归源码
'''


x=2*np.random.rand(100,1)#生成[0,1)之间的数据 100行1列
y=4+3*x+np.random.rand(100,1)  #有个高斯噪声
x_b = np.c_[np.ones((100,1)),x]#按列合并
'''
# plt.plot(x,y,'.')
# plt.show()

x_b = np.c_[np.ones((100,1)),x]#按列合并
# print(x_b.shape)
theta_best = np.linalg.inv(x_b.T.dot(x_b)).dot(x_b.T).dot(y)

'''
# 使用NumPy的线性代数模块
# (np.linalg)中的inv()函数来对矩阵求逆,并用dot()方法计算
# 矩阵的内积
# 实际用来生成数据的函数是y=4+3x1+高斯噪声
'''
'''
'''
print(theta_best)
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new] # add x0 = 1 to each instance
y_predict = X_new_b.dot(theta_best)
print(y_predict)

plt.plot(X_new, y_predict, "r-")
plt.plot(x, y, "b.")
plt.axis([0, 2, 0, 15])
plt.show()
'''

#用轮子
lin_reg = LinearRegression()
lin_reg.fit(x, y)
#输出线性回归的截距和各个系数
print('截距',lin_reg.intercept_)  #intercept_ 偏 差 项
print('各个系数',lin_reg.coef_)#特 征 权 重(coef_)

#评价手段
#最小二乘法
theta_best_svd, residuals, rank, s = np.linalg.lstsq(x_b, y, rcond=1e-6)#最小二乘法  LinearRegression类基于scipy.linalg.lstsq()函数(名称代表“最小二乘”)
print('二乘法',theta_best_svd) #表示每个w的误差
#svd 奇异值分解评价
print('奇异值',np.linalg.pinv(x_b).dot(y))#dot计算矩阵的内积  你可以使用np.linalg.pinv()来直接计算这个伪逆

'''
梯度下降:通过迭代调整参数从而使得成本函数最小
通过测量向量t相关的误差函数的局部梯度,并不断沿着降低梯度的方向调整,直到梯度为0,降低为最小值
由于使用成本函数mems 是个 凸函数,不管怎么下降梯度都会到达全局最小点,避免了局部最小,只不过是时间快慢问题,有特征缩放时间快一点,没有就慢一点
'''
'''
批量梯度下降==全局梯度下降,使用全部的训练集去搞梯度下降
'''
eta = 0.1 # learning rate
n_iterations = 1000
m = 100
theta = np.random.randn(2,1) # random initialization 2行一列
for iteration in range(n_iterations):
    gradients = 2 / m * x_b.T.dot(x_b.dot(theta) - y)#他是使用全部训练集的对于theata去梯度,theta迭代
    theta = theta - eta * gradients
else:
    print('goodtheta',theta)

#如何选择学习率------------网格搜索,但是需要限制迭代次数,这样网格搜索可以淘汰掉那些收敛耗时太长的模型。
'''
注意:SGD和线性梯度下降最大的区别在于:线性梯度下降每次计算成本函数时,是使用全部训练集的
随机梯度下降:每一步在训练集中随机选择一个实例,并且仅基于该单个实例来计
算梯度。它也可以被用来训练海量的数据集,因为每次迭代只需要在内
存中运行一个实例即可;成本函数将不再是缓缓降低直到抵达最小值,而是不断上上下下随着时间的推移,最终会非常接近
最小值,但是即使它到达了最小值,依旧还会持续反弹,永远不会停止
所以算法停下来的参数值肯定是足够好的,但不是最优
的。随机梯度下降其实可以帮
助算法跳出局部最小值,所以相比批量梯度下降,它对找到全局最小值
更有优势。

'''
'''
模拟退火:
开始的步长比较大(这有助于快速进展和逃离局部最小值),然后越来越小,让算法尽量靠近全局最小值。
'''
#学习率调整:
n_epochs = 50 #50轮
t0, t1 = 5, 50 # learning schedule hyperparameters
def learning_schedule(t):
    return t0 / (t + t1)

theta = np.random.randn(2,1) # random initialization 0-1的2行1列
for epoch in range(n_epochs):#50论
    for i in range(m):#每次学习的实例对象
        random_index = np.random.randint(m)#返回0-100随机整数,范围区间为[low,high),包含low,不包含high high没有填写时,默认生成随机数的范围是[0,low)
        xi = x_b[random_index:random_index + 1] #取每次实例的对象,并且是随机取
        yi = y[random_index:random_index + 1]
        gradients = 2 * xi.T.dot(xi.dot(theta) - yi)
        eta = learning_schedule(epoch * m + i) #学习率是不断减小
        theta = theta - eta * gradients

print('suijitheta', theta)
'''
注意:使用随机梯度下降,训练实例必须独立且均匀分布,以确保平均而言将参数拉向全局最优值----直接对数据进行混洗(使用SGD前)
'''
#用轮子--
'''
以下代码最多可运行1000个轮次,或者直到一个轮次期间损失下降小于0.001为止
(max_iter=1000,tol=1e-3)。它使用默认的学习调度(与前一个学习调度不同)以0.1(eta0=0.1)的学习率开始。最后,它不使用任何正则化
'''
sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, penalty=None, eta0=0.1)
sgd_reg.fit(x, y.ravel())
print('SGD:',sgd_reg.intercept_,sgd_reg.coef_)


'''
小批量梯度下降:在小型批量的随机实例集上计算梯度,优于随机梯度下降主要表现在可以通过矩阵优化提高性能,特别在使用GPU
'''


#

``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值