您的位置:首页 > 编程语言 > Python开发

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

2017-05-23 21:59 302 查看

算法简介

给定数据集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 np
from 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 wb

def 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐