首页 > 程序开发 > 综合编程 > 其他综合 >

线性回归总结

2017-01-19

线性回归总结:当结果与特征之间的关系存在线性关系时,可以用线性回归。有的点比较重要,可以采用加权线性回归,也可以将这个点重复若干次。

线性回归总结:当结果与特征之间的关系存在线性关系时,可以用线性回归。有的点比较重要,可以采用加权线性回归,也可以将这个点重复若干次。为了防止过拟合,一般采用采用岭回归(L2范数),LASSO(L1范数),Elastic Net(L1和L2范数混合)
岭回归防止过拟合,LASSO防止有的特征并不是影响结果的特征,在一定程度上等价于L0范数,Elastic Net结合L1和L2范数
用的网上找的鲍鱼数据做的线性回归,代码如下。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 17 12:43:15 2017
预测鲍鱼壳重
@author: Administrator
"""
import numpy as np
import random as rd
fid = open('./data/abalone/data/abalone.data')
Mat = fid.readlines()
fid.close()
X = [[0]*10 for i in range(len(Mat))]
Y = [0]*len(Mat)
for i in range(len(Mat)):
    line = Mat[i]
    p = line.index(',')
    if line[0:p] == 'F':
        X[i][0] = 1
    else:
        if line[0:p] == 'M':
            X[i][1] = 1
    lineAx = line[p+1:]
    p = lineAx.index(',')
    X[i][2] = float(lineAx[0:p])
    lineAx = lineAx[p+1:]
    p = lineAx.index(',')
    X[i][3] = float(lineAx[0:p])
    lineAx = lineAx[p+1:]
    p = lineAx.index(',')
    X[i][4] = float(lineAx[0:p])
    lineAx = lineAx[p+1:]
    p = lineAx.index(',')
    X[i][5] = float(lineAx[0:p])
    lineAx = lineAx[p+1:]
    p = lineAx.index(',')
    X[i][6] = float(lineAx[0:p])
    lineAx = lineAx[p+1:]
    p = lineAx.index(',')
    X[i][7] = float(lineAx[0:p])
    lineAx = lineAx[p+1:]
    p = lineAx.index(',')
    X[i][8] = int(lineAx[p+1:len(lineAx)-1])
    X[i][9] = 1
    Y[i] = float(lineAx[0:p])

L = 500
'''
直接求解
'''
XAx = np.array(X[0:len(X)-L])
YAx = np.array(Y[0:len(Y)-L])
w = np.dot(np.dot(np.linalg.inv(np.dot(np.transpose(XAx),XAx)),np.transpose(XAx)),YAx)
print(w)
print(np.sqrt(sum(np.square(np.dot(X[len(X)-L:],w) - Y[len(Y)-L:])/L)))

'''
批梯度下降法
'''
eta = 0.001;
XAx = np.array(X[0:len(X)-L])
YAx = np.array(Y[0:len(Y)-L])
w0 = np.array([1]*10)
w1 = np.array(w + [rd.uniform(0,10**-6) for i in range(10)])
ii = 0
while np.linalg.norm(w0 - w1) > 10**-10:
    ii += 1
    #print(ii)
    #print(np.linalg.norm(w0 - w1))
    w0 = w1
    w1 = w1 - eta*(np.dot(np.dot(np.transpose(XAx),XAx),w1) - np.dot(np.transpose(XAx),YAx))/len(YAx)
w0 = w1
print(w0)
print(np.sqrt(sum(np.square(np.dot(X[len(X)-L:],w0) - Y[len(Y)-L:])/L)))

'''
随机梯度下降法
'''
eta = 0.001;
XAx = np.array(X[0:len(X)-L])
YAx = np.array(Y[0:len(Y)-L])
w0 = np.array([1]*10)
w1 = np.array(w + [rd.uniform(0,10**-8) for i in range(10)])
ii = 0
while np.linalg.norm(w0 - w1) > 10**-4:
    ii += 1
    #print(ii)
    #print(np.linalg.norm(w0 - w1))
    w0 = w1
    for i in range(len(XAx)):
        w1 = w1 - eta*(np.dot(np.dot(np.transpose([XAx[i]]),[XAx[i]]),w1) - \
                       np.dot(np.transpose([XAx[i]]),[YAx[i]]))
w0 = w1
print(w0)
print(np.sqrt(sum(np.square(np.dot(X[len(X)-L:],w0) - Y[len(Y)-L:])/L)))

'''
LASSO
'''
from sklearn import linear_model
clf = linear_model.Lasso(alpha = 0.00001)
XAx = np.array(X[0:len(X)-L])
YAx = np.array(Y[0:len(Y)-L])
clf.fit(XAx, YAx)
print(clf.coef_)#w
print(np.sqrt(sum(np.square(np.dot(X[len(X)-L:],clf.coef_) - Y[len(Y)-L:])/L)))
相关文章
最新文章
热点推荐