线性回归—一个典型的机器学习
人工智能
人工智能的概念
说到人工智能,就不要说一下人工智能的几个专业名词的关系
人工智能、机器学习、深度学习,就是这三个东西他们是什么呢。
就其实他们是有一种包含的关系,人工智能描述的是就是你觉得是人工智能的东西。比如智能机器人啊,无人驾驶啊,人脸识别啊,讲道理吼,都算在人工智能里。
然后呢,人工智能里有一部份的都会用到机器学习,因为呢说白了人工智能还是一个输入输出的模型,跟人一样,看到东西然后去理解去学习,就人嘛一开始也是笨笨的,后来慢慢的自己去领悟规则,那机器学习就是这样一部分那最基础的呢大概就是:线性回归啊,kNN啊,SVM啊。
然后学习的能力肯定也有高也有低的,更强的学习能力的呢,就是深度学习这种。高仿人类学习方法的自己学习的能力。比如围棋的阿尔法狗啊,dota里的OPENAI啊,象棋里的阿尔法猫啊旋风之类很多的都是需要用到深度学习的技术,去增强他的学习能力,和让他自己调优
机器学习的本质
以数据为驱动,自主的从数据中寻找规律的方法
1、更少的人为假设和定义
2、更灵活的应用
3、更高的准确度
常见的机器学习方法
模型:f(x)
机器学习:模型应用在学习上,在数据中找到规律的能力
一般有下面的这些方法
回归
概念
根据已有数据,简历因变量Y与自变量X的定量(函数)关系模型
例子
根据给出的数据,拿出对应的回归,在有新自变量出现的时候,可以预测因变量的值
线性回归
案例:用水量和水费的关系啊、车速和行驶距离的关系啊,一动脑袋能想到的很简单的很多都是线性回归。
求解线性回归
搭建一个产量y = f(时长x)的关系
但是就会有个问题,这些数据,放入一个
y=ax+b的函数里,能求出不同的很多直线,到底哪条才是合适的呢,或者这些直线都不合适,需要调优。但是我们就要怎么去评价这个线性回归模型的好坏呢?
评价回归模型表现的好坏
图片里的代数式,求出来的内容就是均方误差
还是用上面的条件,举一个计算均方误差的样例
假设我们用第二组数据,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,也就是找到最小的均方误差,那么用什么方法呢
最小二乘法
那肯定就有很多同学就想到了,对就是他最小二乘法,首先我们把公式放在这里。
然后问题就来了,这个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的时候,。。。。。。。。。。
。。。。。。。
。。。。。。。。。。。。。。。。。。。。。写不下去了。。。。。。。。。。。。。。。。。。。
太多符号了,太难写了,我自己手写推了一遍,字太丑就不放上来了。放一个别人推的
再放一个用高中方法推的www.bilibili.com/video/BV1Sg…
好!那么就当是你们看到我亲自推倒了一遍。
代码题
先试用一下各种功能
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)