线性回归分析——含python代码

  假设样本空间为 d d 个维度,用x={ x1,x2,x3,...,xd x 1 , x 2 , x 3 , . . . , x d }来表示一个样本点,线性回归的目标是用 d+1 d + 1 个参数来拟合样本点的输入和输出。通常我们会将 x x 扩充为 d+1 d + 1 维的向量 x x ={ x0,x1,x2,x3,...,xd x 0 , x 1 , x 2 , x 3 , . . . , x d },第 x0 x 0 设为1作为偏置项。线性回归表达式如下:

f=i=0d+1θixi f = ∑ i = 0 d + 1 θ i x i

用向量可以表示为:
f(x)=θTx f ( x ) = θ T x

将表达式代入均方误差函数 (MSE) ( M S E ) 中:
J=1Ni=1N(yif(xi))2 J = 1 N ∑ i = 1 N ( y i − f ( x i ) ) 2

令全部样本表示为: X X ={x1,x2,x3,...,xN} T T ,对应输出表示为Y={ y1,y2,y3,...,yN y 1 , y 2 , y 3 , . . . , y N } T T ,损失函数可以简化为:
J=1N||XθY||2

我们的目标是让损失函数最小,令其对 θ θ 的偏导数为0,则有:
Jθ===θ[1N(θTXTXθ2θTXTY+YTY)]1N(2XTXθ2XTY)0(1)(2)(3) (1) ∂ J ∂ θ = ∂ ∂ θ [ 1 N ( θ T X T X θ − 2 θ T X T Y + Y T Y ) ] (2) = 1 N ( 2 X T X θ − 2 X T Y ) (3) = 0

解得: θ=(XTX)1XTY θ = ( X T X ) − 1 X T Y
  显然, XTX X T X 要是可逆的,通常情况下都能满足因为 N>>d+1 N >> d + 1 。事实上 XTX X T X 也存在不可逆的情况,这种情况下我们可以选择求伪逆或者梯度下降法来解决问题。
  如果要利用线性回归来解决二分类问题, yi y i 就不再是连续值,而是1(正样本)或者0/-1(负样本)。同样的求出权重向量后对测试样本进行预测,可以用0.5/0作为阈值来划分正负样本。

代码块

理解了线性回归和梯度下降的基本原理,用python撸出来也就10分钟的时间:

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import scale
from random import random
from sklearn.model_selection import train_test_split

class LinearRegression(object):
    weight = np.array([])
    way = 'gd'
    def __init__(self, training_way = 'gd'):
        self.way = training_way
    def gradientDescent(self, X, Y, alpha, epoch):
        W = np.random.normal(0,1,size=(X.shape[1],))
        for i in range(epoch):
            W -= alpha*(X.T).dot(X.dot(W)-Y)/X.shape[0]
        return W

    def fit(self, train_data, train_target, alpha = 0.1, epoch = 300):
        X = np.ones((train_data.shape[0], train_data.shape[1]+1))
        X[:,0:-1] = train_data
        Y = train_target
        if self.way == 'gd':
            self.weight = self.gradientDescent(X, Y, alpha, epoch)
        else:
            self.weight = np.linalg.inv((X.T).dot(X)).dot(X.T).dot(Y)

    def predict(self, test_data):
        X = np.ones((test_data.shape[0], test_data.shape[1]+1))
        X[:,0:-1] = test_data
        return X.dot(self.weight)

    def evaluate(self, predict_target, test_target):
        predict_target[predict_target>=0.5] = 1
        predict_target[predict_target<0.5] = 0
        return sum(predict_target==test_target)/len(predict_target)

if __name__ == "__main__":
    cancer = load_breast_cancer()
    xtr, xval, ytr, yval = train_test_split(cancer.data, cancer.target, \
    test_size=0.2, random_state=7)
    linear = LinearRegression(training_way = 'gd')
    linear.fit(xtr, ytr, alpha = 0.05, epoch = 1000)
    predict = linear.predict(xval)
    print('linear regression accruacy:',linear.evaluate(predict, yval))
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值