首页 > 分享 > python 线性回归

python 线性回归

深度学习模型的训练过程实际上就是在进行参数估计,待估参数是网络模型的权值参数。

线性回归模型的目标函数实际上是关于参数theta的二次函数,则必然是凸函数,则必然有唯一的全局最小值点。故而无论怎么样的训练技巧设置(学习率,batch size),最终必然都会收敛到唯一的全局最小值点。

梯度下降法

1.随机梯度下降法

对于训练数据集(规模为m)中的每个训练样本,都会更新一次参数值,相当于batch size=1

2.批梯度下降法

将整个训练数据集在参数上得到的梯度平均值,对参数更新,batch size=m

3.mini-batch 小批量梯度下降法

batch size设定,将在若干个样本上计算得到的梯度平均值作为梯度,更新参数。

import os

import numpy as np

class train_linear_reg():

def __init__(self,x_train,y_train,lam):

self.x_train=x_train

self.y_train=y_train

self.lam=lam

self.num_train=self.x_train.shape[0]

self.num_feat=self.x_train.shape[1]

self.theta=np.random.randn(num_feat).reshape(self.num_feat,1)

def min_square(self):

'''

:return: 使用最小二乘的矩阵相乘法

X*theta=Y

'''

self.theta=np.dot(self.x_train.T,self.x_train)

self.theta+=self.lam*np.eye(self.num_feat)

self.theta=np.linalg.inv(self.theta)

mid=np.dot(self.x_train.T,self.y_train)

self.theta=np.dot(self.theta,mid)

return self.theta

def cal_Loss(self,x,y):

'''

计算prediction error

:param x:

:param y:

:return:

'''

pred=np.dot(x,self.theta)

error_vector=pred-y

loss=np.dot(error_vector.T,error_vector)

loss+=np.dot(self.theta.T,self.theta)

loss/=2

return loss

def pred(self,test_x,test_y):

return self.cal_Loss(test_x,test_y)

if __name__=='__main__':

data_path='F:machine_learningyalinghw_2'

with open(os.path.join(data_path,'train-matrix.txt'),'r') as train_file:

all_lines=train_file.readlines()

num_train=int(all_lines[0].strip())

num_feat=int(all_lines[1].strip())

train_matrix=np.zeros((num_train,num_feat))

train_label=np.zeros((num_train,1))

for i in range(num_train):

train_matrix[i,:]=np.array(list(map(float,all_lines[i+2].split())))

train_label[i,0]=float(all_lines[2+num_train+i])

lam_list=[0.0125, 0.025, 0.05, 0.1, 0.2]

k=10

example_per_flod=num_train//k

best_solver=None

pred_error=float('inf')

for lam in lam_list:

temp_lam_error=0.0

for flod in range(k):

if flod==0:

temp_train_x = train_matrix[(flod + 1) * example_per_flod:, :]

temp_train_y = train_label[(flod + 1) * example_per_flod:, :]

elif flod==k-1:

temp_train_x = train_matrix[:flod * example_per_flod, :]

temp_train_y = train_label[:flod * example_per_flod, :]

else:

temp_train_x = np.concatenate(

(train_matrix[:flod * example_per_flod, :], train_matrix[(flod + 1) * example_per_flod:, :]),

axis=0)

temp_train_y = np.concatenate(

(train_label[:flod * example_per_flod, :], train_label[(flod + 1) * example_per_flod:, :]), axis=0)

temp_test_x=train_matrix[flod*example_per_flod:(flod+1)*example_per_flod,:]

temp_test_y=train_label[flod*example_per_flod:(flod+1)*example_per_flod,:]

temp_solver=train_linear_reg(temp_train_x,temp_train_y,lam)

temp_solver.min_square()

temp_lam_error+=temp_solver.pred(temp_test_x,temp_test_y)

temp_pred_error=temp_lam_error/k

print('lam:%.6f,valid loss:%.8f' % (lam, temp_pred_error))

if temp_pred_error<pred_error:

pred_error=temp_pred_error

best_solver=temp_solver

print(best_solver.theta,best_solver.lam)

new_solver=train_linear_reg(train_matrix,train_label,best_solver.lam)

with open(os.path.join(data_path,'test-matrix.txt'),'r') as test_file:

all_lines=test_file.readlines()

num_test=int(all_lines[0].strip())

num_feat=int(all_lines[1].strip())

test_matrix=np.zeros((num_test,num_feat))

test_label=np.zeros((num_test,1))

for i in range(num_test):

test_matrix[i,:]=np.array(list(map(float,all_lines[i+2].split())))

test_label[i,0]=float(all_lines[2+num_test+i])

test_err=new_solver.pred(test_matrix,test_label)

print('test_err:',test_err)

with open(os.path.join(data_path,'true-beta.txt'),'r') as t:

all_lines=t.readlines()

num_feat=int(all_lines[0])

true_beta=np.zeros((num_feat,1))

for j in range(num_feat):

true_beta[j,:]=float(all_lines[j+1])

distance=true_beta-new_solver.theta

distance=np.dot(distance.T,distance)

print('distance',distance)

A=[]

beta=np.zeros((num_feat,1))

for temp_k in range(6):

error=np.dot(train_matrix,beta)-train_label

all_samples=np.abs(np.dot(train_matrix.T,error))

temp_i=np.argmax(all_samples,axis=0)

if temp_i not in A:

A.append(temp_i)

temp_x=train_matrix.copy()

used_x=np.zeros((num_train,0))

used_list=[]

for i in A:

used_list.append(train_matrix[:,i])

used_x=np.concatenate(used_list,axis=1)

print('used_x',used_x.shape)

used_beta=np.linalg.inv(np.dot(used_x.T,used_x))

mid=np.dot(used_x.T,train_label)

used_beta=np.dot(used_beta,mid)

used_beta=used_beta.tolist()

for p in range(num_feat):

if p not in A:

beta[p,:]=0

else:

beta[p,:]=used_beta.pop(0)

print(beta)

here_solver=train_linear_reg(train_matrix,train_label,0)

here_solver.theta=beta

print(here_solver.pred(test_matrix,test_label))

相关知识

线性回归实例
task1 线性回归
Iris鸢尾花数据集可视化、线性回归、决策树分析、KMeans聚类分析
《Python机器学习开发实战》电子书在线阅读
[Python] 机器学习
线性回归模型
基于Logistic回归模型对鸢尾花数据集的线性多分类
python鸢尾花数据集的分类问题 -- 逻辑回归问题研究
【数据挖掘】一元线性回归在鸢尾花数据集中实战预测(超详细 附源码)
【python数据挖掘课程】十九.鸢尾花数据集可视化、线性回归、决策树花样分析

网址: python 线性回归 https://m.huajiangbk.com/newsview606812.html

所属分类:花卉
上一篇: 腊梅花可以放卧室吗
下一篇: 91好课| 成绩=天赋×努力,这