本文主要在利用python+sklearn.linear_model实现简单的线性回归,作为初学者的入门篇,内容若有错误,烦请大家指正,也希望多多交流。python对代码的缩进、空格非常敏感,若文中代码执行出错,先检查缩进空格问题。
1.机器学习
定义:通过经验E,针对某些任务T,设计出一段计算机程序,该程序拥有特定的绩效指标P,程序的目的就是根据历史经验E的不断的积累在任务T中提高它的绩效指标P。
一些术语
分类:分类指的是在一个预测任务中把数据分类。回归主要是统计意义上的用于预测数据。如线性回归、logistics回归等等。
回归:回归主要是统计意义上的用于预测数据。如线性回归、logistics回归等等。
监督学习:这类算法明确知道自己预测的是什么,目标变量非常明确。
非监督学习:没有给定的正确答案。单纯的给一堆数据,找到这些数据的结构特点,即聚类。
2.搭建环境
OS:mac 10.12.5
python 2.7+Anaconda2 4.4.0
Anaconda2是一个开源的Python发行版本,里面包含了很多科学报以其依赖项。且包含了Python、Ipython、Jupyter notebook、spyder等内容、非常好用,强烈推荐。不过文件比较大(500MB左右),也可以先从Miniconda这个较小的发行版先入手。
3.准备数据
首先打开数据文件ex0.txt
数据中第一列都是1, 是线性方程中的常数项,显然可以将后面两列作为x,y值,根据需要可以给其赋予现实意义,目前仅做数学问题来讨论。
所有数据(列与列)的间隔都是用tab号分隔,每一个样本数据各占一行,方便后期数据读取。
数据分析最方便的就是将数据转为可视化的结果,那么我们可以先画个图看看数据的趋势。
1.1准备数据
新建test.py文本。在画图之前,我们首先需要:读取数据,将数据解析并保存到矩阵中。代码如下:
#!/usr/bin/env python
#coding=utf-8
from numpy import *
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#定义读取数据函数
def file2matrix(filename):
f = open(filename)
contents = f.readlines()
length = len(contents) #得到文件内容的行数
Mat = zeros((length,3)) #创建一个空矩阵用于存储文件内容
index = 0 #索引
for line in contents:
line = line.strip() #去除每一行的换行符
data = line.split('\t')
Mat[index, :] = data
index +=1
return mat(Mat)
data_file="/Users/shin/AnacondaProjects/test/ex0.txt" #文件存放路径
dataMat = file2matrix(data_file)
print dataMat[:, 1] #打印第二列数据
之后通过命令行进入到test.py文件所在的目录,执行
python test.py 即可在终端看到输出的数据。
1.2 分析数据:使用Matplotlib创建散点图
#定义画图函数
def my_scatter(dataMat):
x = dataMat[:, 1]
y = dataMat[:, 2]
plt.title('ex0')
plt.xlabel('x')
plt.ylabel('y')
plt.scatter(x, y, s=10)
plt.show()
my_scatter(dataMat) #调用函数生成图片
执行test.py文件 得到下图源数据的散点图。
3.回归预测
源数据的散点图已经得到了,可以很明显的看得出来图片呈现上升的趋势,而且如果想用一条线来拟合该趋势的话,应该是一条直线。因此,我们给出拟合曲线的“假设函数”:\[y=ax+b\]利用sklearn.linear_model模型实现回归预测。代码如下:
X = dataMat[:, 1]
y = dataMat[:, 2]
m = len(y)
linreg = LinearRegression()
linreg.fit(X, y)
print ("b=%f" %linreg.intercept_)
print ("a=%f" %linreg.coef_)
执行test.py文件
可得a=1.698223,b=3.005158
4.比较结果
将源数据的散点图和得到的结果画在一张图上作比较
def result(dataMat):
x = dataMat[:, 1]
y = dataMat[:, 2]
t = x*linreg.coef_+linreg.intercept_
plt.title('result')
plt.xlabel('x')
plt.ylabel('y')
plt.scatter([x], [y], s=10)
plt.scatter([X], [t], s=10)
plt.show()
result(dataMat)
去除掉一些偏离较大的数据,源数据较均匀的分布在直线\[y=1.698223x+3.005158\]的两侧。可以拿这条直线作为结果预测未来的数据走向。
第一次机器学习就讲到这里,日后有机会再来分享~