机器学习第四周-线性回归算法

学习内容
  • 简单线性回归
  • 最小二乘法数据推导
  • 简单线性回归向量化应用
  • 多元性回归和正规方程实现

一、简单线性回归概念

  • Label为连续数值型,如房价、股票价格、降雨量,只有一个样本特征,即只有一个自变量,回归是指用方程来模拟变量之间是如何关联的。
  • 我们所谓的建模过程,其实就是找到一个模型,最大程度的拟合我们的数据,要想最大的拟合数据,本质上就是找到没有拟合的部分,也就是损失的部分尽量小,就是损失函数,也有算法是衡量拟合程度,称为效用函数。
  • 所谓“鲁棒性”,也是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性
  • 极大似然估计:一般说来,事件A发生的概率与某一未知参数 有关, 取值不同,则事件A发生的概率 也不同,当我们在一次试验中事件A发生了,则认为此时的 值应是t的一切可能取值中使 达到最大的那一个,极大似然估计法就是要选取这样的t值作为参数t的估计值,使所选取的样本在被选的总体中出现的可能性为最大

二、最小二乘法

  • 损失函数:0-1损失、平方损失、绝对损失、对数损失
  • 对数损失函数:是预测值Y和条件概率之间的衡量,用到了极大似然估计的思想。由于概率之间同时满足需要使用乘法,为了将其转化为加法,对数处理,最后由于是损失函数,所以预测正确的概率越高,其损失值越小,因此取反
  • 期望风险是损失函数的期望
  • 经验风险是模型关于训练数据集的平均损失
  • 根据大数定律,当样本容量N趋向于无穷大,经验风险趋于期望风险
  • 为解决过拟合,在经验风险上加上一个正则化项,或叫罚项
  • 正则化项是J(f)函数的复杂度再乘一个权重系数
import numpy as np
import matplotlib.pyplot as plt

x = np.array([1.,2.,3.,4.,5.,])
y = np.array([1.,2.,3.,4.,5.,])
plt.scatter(x,y)
plt.axis([0,6,0,6])
plt.show()

在这里插入图片描述

# 首先计算x和y的均值
x_mean = np.mean(x)
y_mean = np.mean(y)

# a的分子num、分母d
num = 0.0
d = 0.0
for x_i,y_i in zip(x,y):# zip函数打包成[x_i,y_i……]的形式
    num = num + (x_i - x_mean)*(y_i - y_mean)
    d = d + (x_i - x_mean)**2
a = num / d
b = y_mean - a * x_mean

# 求出a,b之后,可以计算出y的预测值,首先绘制模型直线
y_hat = a * x + b
plt.scatter(x,y) # 绘制散点图
plt.plot(x,y_hat,color='r') # 绘制直线
plt.axis([0,6,0,6])
plt.show()

在这里插入图片描述

# 然后进行预测:
x_predict = 6
y_predict = a * x_predict + b
print(y_predict)

三、向量化运算

  • 向量点乘: 向量W和向量V,每个向量对应项,相乘再相加。非常常用的加速计算的方式,特别适合深度学习等需要训练大数据的领域
    对于 y = wx + b, 若 w, x都是向量,那么,可以用两种方式来计算,第一是for循环:
y = 0
for i in range(n):
    y += w[i]*x[i]
    y += b

c = 0
tic = time.time()
for i in range(1000000):
    c += a[i] * b[i]
toc = time.time()
print("c:%f" % c)
print("vectorized version:" + str(1000*(toc-tic))+ "ms")

另一种方法就是用向量化的方式实现:

y = np.dot(w,x) + b

import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

tic = time.time()
c = np.dot(a,b)
toc = time.time()
print("c:%f" % c)
print("vectorized version:" + str(1000*(toc-tic))+ "ms")

pycharm 创建一个SimpleLinearRegression.py,实现自己的工程文件并调用

import numpy as np

class SimpleLinearRegression:
    def __init__(self):
        """模型初始化函数"""
        self.a_ = None
        self.b_ = None

    def fit(self, x_train, y_train):
        """根据训练数据集x_train,y_train训练模型"""
        assert x_train.ndim ==1, \
            "简单线性回归模型仅能够处理一维特征向量"
        assert len(x_train) == len(y_train), \
            "特征向量的长度和标签的长度相同"
        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)
        num = (x_train - x_mean).dot(y_train - y_mean)  # 分子
        d = (x_train - x_mean).dot(x_train - x_mean)    # 分母
        self.a_ = num / d
        self.b_ = y_mean - self.a_ * x_mean

        return self

    def predict(self, x_predict):
        """给定待预测数据集x_predict,返回表示x_predict的结果向量"""
        assert x_predict.ndim == 1, \
            "简单线性回归模型仅能够处理一维特征向量"
        assert self.a_ is not None and self.b_ is not None, \
            "先训练之后才能预测"
        return np.array([self._predict(x) for x in x_predict])

    def _predict(self, x_single):
        """给定单个待预测数据x_single,返回x_single的预测结果值"""
        return self.a_ * x_single + self.b_

    def __repr__(self):
        """返回一个可以用来表示对象的可打印字符串"""
        return "SimpleLinearRegression()"

在jupyter中调用我们自己写的程序:

from SimpleLinearRegression import SimpleLinearRegression

x = np.array([1.,2.,3.,4.,5.])
y = np.array([1.,3.,2.,3.,5,])
x_predict = np.array([6])
reg = SimpleLinearRegression()
reg.fit(x,y)
reg.predict(x_predict)
reg.a_
reg.a_

在这里插入图片描述



y_hat = reg.predict(x)

plt.scatter(x,y)
plt.plot(x,y_hat,color='r')
plt.axis([0,6,0,6])
plt.show()

在这里插入图片描述

四、多元性回归和正规方程实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是这种朴素的计算方法,缺点是时间复杂度较高:O(n^3),在特征比较多的时候,计算量很大。优点是不需要对数据进行归一化处理,原始数据进行计算参数,不存在量纲的问题(多选线性没必要做归一化处理)

多元线性回归方程的推导和向量矩阵转置比较懵逼,实现还未实践
##############################################################################################################
@ 2019.12.01 木居居士的机器学习小组 第四周 打卡
安利公益监督学习组织 - 【公众号】数据科学家联盟
https://mp.weixin.qq.com/s/1WWmbLZucz9vIp-4tKKQ5Q
感谢木东大佬、饼干大佬、南头大佬、星空妹砸、Desitiny、DD的无私付出,抱拳ing~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值