机器学习·回归

线性回归

损失函数

J ( w , b ) = 1 2 m ∑ i = 1 m ( f ( i ) ( w 1 , w 2 , … , w j , b ) − y ( i ) ) 2 J(w,b)=\frac{1}{2m}\sum_{i=1}^{m}\left({f^{(i)}(w_1,w_2,\ldots,w_j,b)-y^{(i)}} \right)^2 J(w,b)=2m1i=1m(f(i)(w1,w2,,wj,b)y(i))2

梯度下降方法

w i = w i − α 1 m ∑ i = 1 m ( f ( i ) ( w 1 , w 2 , … , w j , b ) − y ( i ) ) w i w_i=w_i-\alpha\frac{1}{m}\sum_{i=1}^{m}({f^{(i)}(w_1,w_2,\ldots,w_j,b)-y^{(i)}})w_i wi=wiαm1i=1m(f(i)(w1,w2,,wj,b)y(i))wi
b = b − α 1 m ∑ i = 1 m ( f ( i ) ( w 1 , w 2 , … , w j , b ) − y ( i ) ) b=b-\alpha\frac{1}{m}\sum_{i=1}^{m}({f^{(i)}(w_1,w_2,\ldots,w_j,b)-y^{(i)}}) b=bαm1i=1m(f(i)(w1,w2,,wj,b)y(i))
i = 1 , 2 , … , m  表示 m 组数据集 j = 1 , 2 , … , p  表示 p 个 w i α  表示学习率,随着变量增多不宜过大 i=1,2,\ldots,m\ 表示m组数据集\\j=1,2,\ldots,p\ 表示p个w_i\\\alpha\ 表示学习率,随着变量增多不宜过大 i=1,2,,m 表示m组数据集j=1,2,,p 表示pwiα 表示学习率,随着变量增多不宜过大

线性回归代码

  • 损失函数两层循环,一层针对 Σ \Sigma Σ一层针对所有 w j w_j wj
  • 时间复杂度:O( n 2 m n^2m n2m) m是迭代次数

一元线性回归代码

def cost(x,y,w,b):
    cost=0
    m=x.shape[0]# 第一行的维度 numpy默认对行操作
    for i in range(m):
        cost+=(y[i]-w*x[i]-b)**2
    cost/=2*m
    return cost
def gradient(x,y,w,b):
    m=x.shape[0]
    dj_dw_total=0
    dj_db_total=0
    for i in range(m):
        dj_dw=(w*x[i]+b-y[i])*x[i]
        dj_db=(w*x[i]+b-y[i])
        dj_dw_total+=dj_dw
        dj_db_total+=dj_db
    dj_dw_total/=m
    dj_db_total/=m
    return dj_dw_total,dj_db_total
def gradient_descent(x,y,w0,b0,alpha,iteration,cost,gradient):
    J=[]
    parameter=[]
    w=w0
    b=b0

    for i in range(iteration):
        dj_dw,dj_db=gradient(x,y,w,b)
        w-=alpha*dj_dw
        b-=alpha*dj_db

        J.append(cost(x,y,w,b))
        parameter.append([w,b])

        if i % math.ceil(iteration / 10) == 0:
            print(f"Iteration {i:4}: Cost {J[-1]:0.2e} ",
                  f"dj_dw: {dj_dw: 0.3e}, dj_db: {dj_db: 0.3e}  ",
                  f"w: {w: 0.3e}, b:{b: 0.5e}")

    print('现在为你绘制损失函数')
    plt.figure(figsize=(12, 6))
    plt.subplot(1,2,1)
    plt.plot(J[:100])
    plt.ylabel('cost')
    plt.xlabel('迭代次数')

    plt.subplot(1, 2, 2)
    plt.plot(np.arange(100,len(J)),J[100:])
    plt.ylabel('cost')
    plt.xlabel('迭代次数')
    plt.show()



    return w,b,J,parameter

多元线性回归

def multi_cost(X,Y,w,b):
    m=X.shape[0]
    cost=np.sum((X@w+b-Y)**2)
    return cost
def multi_gradient(X,Y,w,b):
    m,n=X.shape
    dj_dw=np.zeros((n,))
    dj_db=0
    for i in range(m):
        temp=X[i]@w+b-Y[i]
        for j in range(n):
            dj_dw[j]+=temp*X[i,j]
        dj_db+=temp
    dj_dw=dj_dw/m
    dj_db=dj_db/m
    return dj_dw,dj_db
def mutil_gradient_descent(X,Y,w0,b0,alpha,iteration,multi_cost,multi_gradient):

    J=[]
    parameter=[]
    w=w0
    b=b0
    J.append(multi_cost(X,Y,w,b))
    parameter.append([w,b])
    for i in range(iteration):
        dj_dw,dj_db=multi_gradient(X,Y,w,b)
        w-=alpha*dj_dw
        b-=alpha*dj_db

        if i < 100000:  # prevent resource exhaustion
            J.append(multi_cost(X, Y, w, b))
            parameter.append([w,b])

        # Print cost every at intervals 10 times or as many iterations if < 10
        if i % math.ceil(iteration / 10) == 0:
            print(f"Iteration {i:4d}: Cost {J[-1]:8.2f}   ")

    print('现在为你绘制损失函数')
    plt.figure(figsize=(12, 6))
    plt.subplot(1, 2, 1)
    plt.plot(J[:len(J)//2])
    plt.ylabel('cost')
    plt.xlabel('迭代次数1')

    plt.subplot(1, 2, 2)
    plt.plot(np.arange(len(J)//2, len(J)), J[len(J)//2:])
    plt.ylabel('cost')
    plt.xlabel('迭代次数2')
    plt.show()

    return J,parameter

特征工程

提升梯度下降的性能

多项式函数

本质上也是线性回归

归一化

x i − μ x m a x − x m i n \frac{x_i-\mu}{x_{max}-x_{min}} xmaxxminxiμ

z-score标准化

x i − μ σ \frac{x_i-\mu}{\sigma} σxiμ
其中: μ 是均值, σ 是方差 其中:\mu是均值,\sigma是方差 其中:μ是均值,σ是方差

逻辑回归

使用线性函数预测连续值,映射到概率函数sigmoid,然后选择决策阈值即可判断0-1问题

Sigmoid函数

输出为0-1之间的概率函数,具有良好性质
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1

逻辑回归的损失函数

为了保证梯度下降法的准确性,我们必须保证损失函数是一个凸函数或者凹函数。

在这里插入图片描述
在这里插入图片描述

梯度

与线性回归一致,但是注意这里的 f w , b ( x ( i ) ) f_{w,b}(x^{(i)}) fw,b(x(i))已经改为了上述的概率sigmoid函数
在这里插入图片描述

过拟合

在训练集表现良好,但在预测上表现糟糕
特征是较高的方差

正则化

正则化是对复杂的拟合函数进行惩罚的一种方式,正则项的公式如下:
λ 2 m ∑ i = 0 m − 1 w i 2 \frac{\lambda}{2m}\sum_{i=0}^{m-1}w_i^2 2mλi=0m1wi2
注意训练集、测试集、交叉验证集计算损失时不需要考虑正则项。


sklearn.processing

from sklearn.preprocessing import StandardScaler,PolynomialFeatures

标准化工具

fit_transform(X_train)储存中均值,方差的信息,并利用这些信息标准化对象

scaler=StandardScaler()# 构造函数
x_norm=scaler.fit_transform(X_train)
X_norm=scaler.transform(X_train)

多项式工具

机器学习中,多项式仍被视为一种线性回归
作用是:将数据 x 1 , x 2 → x 1 , x 2 , x 1 x 2 , x 1 2 , x 2 2 x_1,x_2\to x_1,x_2,x_1x_2,x_1^2,x_2^2 x1,x2x1,x2,x1x2,x12,x22

poly.fit_transform(x_train)仍会储存多项式信息

poly = PolynomialFeatures(degree, include_bias=False)
X_train_mapped = poly.fit_transform(x_train)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值