白话线性回归(最小二乘法)-浅显易懂的描述

生活中的线形回归现象

经验和工资是不是有关系?是不是经验越多,工资越高呢?

牛奶喝的越多是不是汇越来越高?房价在不同区域,不同时间,不同户型的价格不同

一,概念

例子:一小伙儿说他要因为他女朋友/老婆要改变自己

这里小伙儿改变自己我们叫它自变量,因他女盆友/老婆就是因变量,变化结果就是他女朋友/老婆想要的那很nice的人

那么问题来了?他要怎么改变?改变成什么样子?才是他女盆友/老婆想要的理想状态呢?

小伙儿左思右想?他发现一些小细节,比如发现他女盆友/老婆看到彭于晏的外面就双眼发光,

看到彭于晏的身材就哇哇吼好帅,看到电视剧里面的高端白领就觉得人家好多金,看到运动的小伙儿就说他肥宅。

好我们这里有四个因素了,我们叫它们为特征值

特征值
handsome(颜值)figure(身材)rich(多金)

exercise(运动)

这里我们需要明确一个概念

回归:统计学中分析数据的方法,目的在于了解两个或者多个变量是否相关,研究起相关方向与强度,并建立数学模型以观察特征变量来预测研究者感兴趣的变量。

看不懂就看看这个图:

回归分析:帮助人们了解在自变量变化时因变量的变化量。一般来说通过回归分析我们可以由给定的自变量估计因变量的条件期望。

回到上面的例子。小伙儿发现如下规律表:

Nohandsome(颜值)figure(身材)rich(多金)exercise(运动)nice(女朋友/老婆的nice值)
彭于晏9090809090
张涵予8985758883
岳云鹏32108720

92

李敏搞7966538777
孙悦(说相声那位)1812683

35

小伙儿

 

 

 

 

 

 

 

 

(备注:数据为随机值,只为简化模型,无攻击异性之态)

为了简化模型,我们只取两个特征值:

二,线形回归

根据这些数据我们找到一个平面来拟合我们给的数据

这是一个什么平面,就是上面小伙儿女盆友/老婆觉得很nice的平面,就是说,小伙的点只要离这个平面不远,那么nice值还是可以的。现在小伙儿的困惑就是不知道这个平面具体数据,说一他只有知道的这个平面的大概数据了,才能有正确的方向去改变自己。

所以接下来的问题就是我们要去求这个平面。

假设?1 是handsome的参数,?2是figure的参数。那么彭于晏的这个数据点肯定是在这个平面上的,

或者很接近这个平面。假设这个平面如下:

就是=?1 *90+?12*90+?1 *89+?2*85+...........+?1 *18+?2*12

误差:比如你老婆或者女盆友认为你的nice值时78,但是你自己通过上面的函数预测出来的nice值时83,那么这里就有个误差,

那么我们为了预测得更接近于真实值,那么我们就需要在真实值和预测值之间增加一个数据来调节真实值和预测值。

比如说预测值比真实值太大,那么我们就要减去一个数来让预测值接近于真实值。

那么这里的就是我们的误差。相当于每个样本数据都有一个误差,所有的这些误差都符合均值为0,方差为的高斯分布(这如果你不理解,你就直接为每个数据样本都有误差,且所有的误差都是服从一个规律的,这个规律是大神研究的,明白这一条就行)

误差分布:

 a,独立:彭于晏和岳云鹏的nice值,相互没有关系。

b,nice值都是来自于同一个个体的评判,这里就是小伙儿的老婆/女朋友,不会是张三的老婆一个nice值,李四的老婆一个nice值。

c,高斯分布:nice可能太高,也可能太低,但是浮动不会太大。极小的情况下浮动会比较大。

到这里我们知道了线形回归。但是我们的理想是不是误差越小越好。

这就是我们的问题了,用什么方法才能使误差越小呢?

三,最小二乘法,使误差最小。

误差=真实值-预测值

我们要求这个函数的最小值,相当于一个二次函数的最小值。

其中所以我们的函数可以简化为:

写成矩阵形式:X为m行n列的矩阵,(代表m个样本,每个样本有n特征),θn1列的矩阵Ym行一列的矩阵

要求最小值,我们就通过求偏导数来实现

这其中用到的公司有

如果你不懂公式推导,那么久记住就行。

偏导数=0,就是最优解

最小二乘法:,这个就是我们的最优解。

代码实现:

# 最小二乘法,求最优解
# 倒入基本的包
%matplotlib inline
import os
os.chdir(r'./')
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#读入文件数据
data = pd.read_table('data_line.txt',sep='	',names=['x1','y'])
data['x0'] = 1
feature = data[['x0','x1']]
label=data['y']

# 画出原始数据散点图
plt.figure(figsize=(8,4),dpi=100)
plt.scatter(data['x1'],label,color='black')
plt.title('original_data')

# 转化为矩阵,求解最优theta,就是是误差最小的参数
feature_matrix = np.mat(data[['x0','x1']])
label_matrix = np.mat(data['y']).T
# 这里就是theta的最优解算法
theta = (feature_matrix.T * feature_matrix).I * feature_matrix.T * label_matrix
y_predict = feature_matrix * theta

# 画出拟合线
plt.figure(figsize=(8,4),dpi=100)
plt.scatter(data['x1'],label,color='black') #原始数据
plt.plot(data['x1'],y_predict,color='blue',linewidth=4) #原始数据加上拟合的线
plt.title('least_square')

这里我们看看data数据

这里的x0,x1就是特征值。

我们来看看原始数据的散点图是不是接近一条直线。

那我们就来画一条直线

这里我们运用最小二乘法找到了这个函数,在一维空间就是函数,在二维空间就是一个平面。就是我们举例中的那个小伙儿寻找的nice值,如果他要提高自己的nice值,那么就要去修炼数据,越靠近这个函数或者平面预测越高。

三,思考和后续

这里的最小二乘法很明显,从线形代数角度看我们要求矩阵的逆,但是不是所有矩阵都可以求出矩阵的逆,也就是说,有些矩阵没有逆矩阵的。如果你听不懂,那我说个事情,你初中一年级的时候是不是经常解方程组,比如

2x+3y = 12

x+2y = 8

这个方程组的你会很快解出来,x = 0,y=4。那如果是如下方程组呢?

x-3y = 2

-2x+6y = 5

那这个方程组你能解除x,y吗?显然不能,所以就是说不一定所有的方程组都有解,只要你明白了这个,那么就能理解有些矩阵是没有逆矩阵的这种情况了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值