回归算法——python实现线性回归

来源:互联网 发布:java实时读取log文件 编辑:程序博客网 时间:2024/06/05 15:44

算法简介

给定数据集D={(x1,y1),(x2,y2),…,(xm,ym)},一共有m个样本,其中每个样本有d个属性,即xi = (xi1,xi2,…,xid)。线性回归是试图学到一个线性模型 f(x) = w1*x1+w2*x2+…+wd*xd + b以尽可能准确的预测实值输出标记。 其中w=(w1,w2,…,wd), w和b是通过学习之后,模型得以确定。
w和b的确定是通过损失函数确定的:
这里写图片描述

用最小二乘法对w和b进行估计。把w和b吸收入向量形式,w’ = (w;b),相应的数据集D表示为一个m*(d+1)的矩阵X,其中每一行对应一个示例,该行前d个元素对应于示例的d个属性值,最后一个元素恒为1。则对于上面的公式有:
这里写图片描述
对w’求导得:
这里写图片描述
令上式为零(当X^TX为满秩矩阵或正定矩阵时可得):
这里写图片描述
令xi’ = (xi;1)则线性回归模型为:
这里写图片描述

python实现过程

训练得到w和b的向量:

def train_wb(X, y):    """    :param X:N*D的数据    :param y:X对应的y值    :return: 返回(w,b)的向量    """    if np.linalg.det(X.T * X) != 0:        wb = ((X.T.dot(X).I).dot(X.T)).dot(y)        return wb

获得数据的函数,其中数据下载自

http://download.csdn.net/detail/google19890102/7386709

def getdata():    x = []; y = []    file = open("C:\\Users\\cjwbest\\Desktop\\ex0.txt", 'r')    for line in file.readlines():        temp = line.strip().split("\t")        x.append([float(temp[0]),float(temp[1])])        y.append(float(temp[2]))    return (np.mat(x), np.mat(y).T)

画图函数,分别把训练用的数据的散点图还有回归直线画出来了。

def draw(x, y, wb):    #画回归直线y = wx+b    a = np.linspace(0, np.max(x)) #横坐标的取值范围    b = wb[0] + a * wb[1]    plot(x, y, '.')    plot(a, b)    show()

整体代码如下:

#-*- coding:utf-8 -*-import numpy as npfrom pylab import *def train_wb(X, y):    """    :param X:N*D的数据    :param y:X对应的y值    :return: 返回(w,b)的向量    """    if np.linalg.det(X.T * X) != 0:        wb = ((X.T.dot(X).I).dot(X.T)).dot(y)        return wbdef test(x, wb):    return x.T.dot(wb)def getdata():    x = []; y = []    file = open("ex0.txt", 'r')    for line in file.readlines():        temp = line.strip().split("\t")        x.append([float(temp[0]),float(temp[1])])        y.append(float(temp[2]))    return (np.mat(x), np.mat(y).T)def draw(x, y, wb):    #画回归直线y = wx+b    a = np.linspace(0, np.max(x)) #横坐标的取值范围    b = wb[0] + a * wb[1]    plot(x, y, '.')    plot(a, b)    show()X, y = getdata()wb = train_wb(X, y)draw(X[:, 1], y, wb.tolist())

运行结果如图所示:
这里写图片描述

参考内容:《机器学习》周志华
http://blog.csdn.net/google19890102/article/details/51005766