机器学习+python入门(一)

本文主要在利用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\]的两侧。可以拿这条直线作为结果预测未来的数据走向。

第一次机器学习就讲到这里,日后有机会再来分享~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容