线性回归
线性回归
概述
本部分为自己学习部分机器学习算法中的一部分笔记及感想,我的方向和机器学习无关,可能对一些问题分析的并不准确,有问题欢迎一起探讨商榷。由于这是第一篇推文,因此首先介绍一些基本概念性东西。创作不易,点个“在看”呗。
数学模型
不知道大家有没有数学建模的经历,我还记得大一时听到数学建模这玩意就浑身犯怵,一方面害怕数学
,另一方面不知道模型为何物。后来随着自己接触到数学建模,发觉他也不是不可靠近的......
说了这么多,其实就是想要说一下模型。在数学建模里面,所谓模型就是找到数据与数据之间的关系,根据关系去解决实际问题。
其实在机器学习中,模型也可以用上面的方法来理解,根据已有数据找数据关系,将关系存储下来,输入新的数据进已有关系,得到一个结果。具体可用下面一个图来解释。
所谓机器学习,无非就是利用海量数据去训练出来一个比较好的模型,利用训练好的模型去处理实际问题。而在训练模型时,不同问题又有着各自不同的训练方法,进而催生了大量的机器学习算法。
线性回归
对于线性回归,首先需要去理解其基本概念。可将“线性回归”拆分为“线性”和“回归”两个词来理解。
1.线性和非线性
线性:两个变量成一次函数关系,在图像上表现为图像为直线。
非线性:与线性相对,两个变量不是一次函数关系,图像不是直线。
2.回归
确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。回归分析按照涉及的变量的多少,分为一元回归和多元回归分析;按照因变量的多少,可分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。
PS:利用已有数据跑出来的模型去求解问题时或多好少都会有些偏差,关于这类的相关概念就不说了,只会说一下对于某一类算法而言尤其需要注意的问题。如对于回归类问题而言,欠拟合和过拟合问题就显得格外值得关注(当然对于其他模型训练时也很重要)。
欠拟合和过拟合
在模型训练时,模型的泛化能力越强就说明这个模型表现越好。所谓泛化能力可以理解为:你用一个数据集训练的模型不能只在这个模型好使,在其他数据集上也要好使。
1.欠拟合
训练集的预测值,与训练集的真实值有不少的误差,称之为欠拟合。
2.过拟合
训练集的预测值,完全贴合训练集的真实值,称之为过拟合。
欠拟合和过拟合在回归上表现为:一个预测结果偏离真实值,一个预测结果过分接近真实值。
其中过拟合没找到例子就用原直线了。
实现线性回归
理论结束,我们现在开始写代码,实现一元线性回归。
1.动手实现
(1)定义训练数据
# 定义训练数据
x = np.array([1, 3, 2, 1, 3])
y = np.array([19, 24, 18, 17, 27])
(2)回归方程求解
求解回归方程中的两个参数:斜率和截距
# 回归方程求取函数
def fit(x, y):
if len(x) != len(y):
return
numerator = 0.0
denominator = 0.0
x_mean = np.mean(x)
y_mean = np.mean(y)
for i in range(len(x)):
numerator += (x[i] - x_mean) * (y[i] - y_mean)
denominator += np.square((x[i] - x_mean))
print('numerator:', numerator, 'denominator:', denominator)
b0 = numerator / denominator
b1 = y_mean - b0 * x_mean
return b0, b1
(3)返回回归方程
b0, b1 = fit(x, y)
print('Line is:y = %2.0fx + %2.0f' % (b0, b1))
(4)根据回归方程对未来数据预测
# 预测
x_test = np.array([0.5, 1.5, 2.5, 3, 4])
y_test = np.zeros((1, len(x_test)))
for i in range(len(x_test)):
y_test[0][i] = predit(x_test[i], b0, b1)
结果如下:蓝色点为训练,红色为测试。
2.调用库实现
其实上面说了这么多可能对于很多人一点用都没有,我们都是站在巨人肩膀上的,别人已经将计算库写好,使用时一句话就ok了。下面是直接调用别人库的写法。
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from matplotlib.font_manager import FontProperties
import numpy as np
myfont = FontProperties(fname='D:/python_pycharm/front/simhei.ttf')
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [1, 2, 3, 4, 5, 6, 9, 10, 11]
x = np.reshape(x, newshape=(9, 1))
y = np.reshape(y, newshape=(9, 1))
# 调用模型
lr = LinearRegression()
# 训练模型
lr.fit(x, y)
# 计算R平方
print(lr.score(x, y))
# 计算y_hat
y_hat = lr.predict(x)
plt.scatter(x, y)
plt.plot(x, y_hat)
plt.title('线性回归', fontproperties=myfont)
plt.show()
总结
以上只演示了线性回归(一元),对于多元回归,思路都是一样的,大致实现也差不多,只需要把高维数据处理一下即可,在这里就不再说了。毕竟本文是讲线性回归。
- (31) 剖析Arrays / 计算机程序的思维逻辑
- 应用自然语言处理(NLP)解码电影
- 不引入新的数组,实现数组元素交换位置函数
- (30) 剖析StringBuilder / 计算机程序的思维逻辑
- Java初始化顺序
- ConcurrentHashMap使用示例
- (40) 剖析HashMap / 计算机程序的思维逻辑
- nginx配置https(亲测可用)
- linux中无 conio.h的解决办法
- 运用适配器模式应对项目中的变化
- 开车啦!小爬虫抓取今日头条街拍美女图
- C语言中随机数相关问题
- 算法决策兴起:人工智能时代的若干伦理问题及策略|AI观察
- Win10配置人工智能学习平台Tensorflow的正确姿势
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法