人工智能必备数学知识-线性回归

523 阅读5分钟

线性回归—一个典型的机器学习

人工智能

人工智能的概念

说到人工智能,就不要说一下人工智能的几个专业名词的关系

人工智能、机器学习、深度学习,就是这三个东西他们是什么呢。

就其实他们是有一种包含的关系,人工智能描述的是就是你觉得是人工智能的东西。比如智能机器人啊,无人驾驶啊,人脸识别啊,讲道理吼,都算在人工智能里。

然后呢,人工智能里有一部份的都会用到机器学习,因为呢说白了人工智能还是一个输入输出的模型,跟人一样,看到东西然后去理解去学习,就人嘛一开始也是笨笨的,后来慢慢的自己去领悟规则,那机器学习就是这样一部分那最基础的呢大概就是:线性回归啊,kNN啊,SVM啊。

然后学习的能力肯定也有高也有低的,更强的学习能力的呢,就是深度学习这种。高仿人类学习方法的自己学习的能力。比如围棋的阿尔法狗啊,dota里的OPENAI啊,象棋里的阿尔法猫啊旋风之类很多的都是需要用到深度学习的技术,去增强他的学习能力,和让他自己调优

image.png

机器学习的本质

以数据为驱动,自主的从数据中寻找规律的方法

1、更少的人为假设和定义

2、更灵活的应用

3、更高的准确度

常见的机器学习方法

模型:f(x)

机器学习:模型应用在学习上,在数据中找到规律的能力

一般有下面的这些方法

image.png

回归

概念

根据已有数据,简历因变量Y与自变量X的定量(函数)关系模型

image.png

例子

image.png

根据给出的数据,拿出对应的回归,在有新自变量出现的时候,可以预测因变量的值

线性回归

image.png

案例:用水量和水费的关系啊、车速和行驶距离的关系啊,一动脑袋能想到的很简单的很多都是线性回归。

求解线性回归

image.png

搭建一个产量y = f(时长x)的关系

但是就会有个问题,这些数据,放入一个 y=ax+b的函数里,能求出不同的很多直线,到底哪条才是合适的呢,或者这些直线都不合适,需要调优。但是我们就要怎么去评价这个线性回归模型的好坏呢?

评价回归模型表现的好坏

image.png

图片里的代数式,求出来的内容就是均方误差

还是用上面的条件,举一个计算均方误差的样例

假设我们用第二组数据,305 = 30a + b
算出来一条直线
y = 10x + 5

我们把数据带入可以得到新表

时长        产量      用新表的数据减去旧的
20         205     (205 - 195)**2= 100
30         305     (305 - 305)**2 = 0
50         505     (505 - 480)**2 = 625
60         580     (605 - 580)**2 = 625

再把结果累加

均方误差的和就是 1350

当然这条直线就是拿了一个点就凭感觉写出来的,对于整个数据这个误差好像还是挺大的。

看到误差以后就会觉得是不是y = 10x -5 更合适一点

但是在一次计算y = 10x -5可能你还是会觉得不够合适

这个时候可能我们就需要一套算法去找到最优的a,b,也就是找到最小的均方误差,那么用什么方法呢

最小二乘法

那肯定就有很多同学就想到了,对就是他最小二乘法,首先我们把公式放在这里。

image.png

然后问题就来了,这个a,b的式子是怎么出来的呢,复习一下,我们用手推到一次

1)我们首先有个y = ax + b
2)给定的数据(x1,y1),(x2,y2),....(xi,yi)
3)我们有一个表示误差值的di = yi - y带入一下开始的y = ax + b就是di = yi - (axi+b)
4)当D = 最小均方误差(就是上一节的那个式子)取最小的时候就是他的导数等于0的时候,。。。。。。。。。。
。。。。。。。
。。。。。。。。。。。。。。。。。。。。。写不下去了。。。。。。。。。。。。。。。。。。。

太多符号了,太难写了,我自己手写推了一遍,字太丑就不放上来了。放一个别人推的

blog.csdn.net/genghaihua/…

再放一个用高中方法推的www.bilibili.com/video/BV1Sg…

好!那么就当是你们看到我亲自推倒了一遍。

代码题

image.png

先试用一下各种功能

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

x = np.linspace(1, 100, 100)

y = 5 * x + 10 + 10 * np.random.randn(100)
print(x)
print(y)

model = LinearRegression()

x = x.reshape(100, 1)
print(x)
y = y.reshape(100, 1)
print(y)
model.fit(x, y)

y_p = model.predict(x)

plt.plot(x, y, ".k")
plt.plot(x, y_p, "b")
plt.show()



后面真的做题就是拿真实数据去做了


data = pd.read_csv("data.csv")#这个是存好数据的文件

print(data.head)

data = data.values

print(data)

x = data[:,1,3]
y = data[:,3]

print(x)
print(y)

from sklearn.linear_model import LinearRegression

model = LinearRegression()

model.fit(x,y)

predict = model.predict(x)

print(predict)

plt.plot(y,predict,".b")

plt.show()


diff = predict-y

mae = np.mean(np.abs(diff))

print(mae)

rmse = np.sqrt(np.mean(diff**2))

print(rmse)

print(np.mean(y))

print(140/4600)