线性回归
![请添加图片描述](https://img-blog.csdnimg.cn/fce2e915198f4276b91c41c5b2a820a1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aKZ57yd6YeM55qE6I2J,size_20,color_FFFFFF,t_70,g_se,x_16)
![请添加图片描述](https://img-blog.csdnimg.cn/6eee3dbf0e6f4c79b4141f13f1789f2e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aKZ57yd6YeM55qE6I2J,size_20,color_FFFFFF,t_70,g_se,x_16)
![请添加图片描述](https://img-blog.csdnimg.cn/f44355fa845e4fa080ed46c656db089b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aKZ57yd6YeM55qE6I2J,size_20,color_FFFFFF,t_70,g_se,x_16)
![请添加图片描述](https://img-blog.csdnimg.cn/038519b1987b46a59e50992827eef819.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aKZ57yd6YeM55qE6I2J,size_20,color_FFFFFF,t_70,g_se,x_16)
![请添加图片描述](https://img-blog.csdnimg.cn/e5308c6258ea4b1cba0254c2bdcd4a3a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aKZ57yd6YeM55qE6I2J,size_20,color_FFFFFF,t_70,g_se,x_16)
![请添加图片描述](https://img-blog.csdnimg.cn/b171e15292c541368b9c07f3227b1458.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aKZ57yd6YeM55qE6I2J,size_20,color_FFFFFF,t_70,g_se,x_16)
![请添加图片描述](https://img-blog.csdnimg.cn/8269f242e32f4cbe8961230a1938febc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aKZ57yd6YeM55qE6I2J,size_20,color_FFFFFF,t_70,g_se,x_16)
import numpy as np
import random
'''
input_data 训练数据集
realresult 训练结果集
theta 参数
'''
def _init_(self,input_data,realresult,theta=None):
'''
:param self:
:param input_data: 输入数据
:param realresult: 真实数据
:param theta: 线性回归参数,默认为None
:return:
'''
row,col=np.shape(input_data)
self.InputData=[0]*row
for(index,data)in enumerate(input_data):
Data=[1.0]
Data.extend(list(data))
self.InputData[index]=Data
self.InputData=np.array(self.InputData)
self.Result=realresult
if theat is not None:
self.Theta=theta
else:
sel .Theta=np.random.normal((col+1,1))
def BGD(self,alpha):
'''
利用BGD算法进行一次迭代调整参数的函数
:param self:
:param alpha: 学习率
:return:
'''
gradient_increasment=[]
for (input_data,real_result) in zip(self.InputData,self.Result):
g=(real_result-input_data.dot(self.Theta))*input_data
gradient_increasment.append(g)
avg_g=np.average(gradient_increasment,0)
avg_g=avg_g.reshape((len(avg_g),1))
self.Theta=self.Theta+alpha*avg_g
def SGD(self,alpha):
'''
利用SGD算法进行一次迭代调整参数的函数
:param self:
:param alpha:学习率
:return:
'''
shuffle_sequence=self.Shuffle_Squence()
self.InputData=self.InputData[shuffle_sequence]
self_Resule=self.Result[shuffle_sequence]
for(input_data,real_result) in zip(self.InputData,self_Resule):
g=(real_result-input_data.dot(self.Theta))*input_data
g=g.reshape((len(g),1))
self_Theta=self_Theta+alpha.g
def MBGD(self,alpha,batch_size):
'''
利用MBGD算法进行一次迭代调整参数的函数
:param self:
:param alpha:
:param batch_size:
:return:
'''
shuffle_sequence=self.Shuffle_Squence()
self.InputData=self.InputData[shuffle_sequence]
self.Result=self.Result[shuffle_sequence]
for start in np.arange(0,len(shuffle_sequence),batch_size):
end=np.min([start+batch_size,len(shuffle_sequence)])
mini_batch=shuffle_sequence[start:end]
Mini_Train_Data=self.InputData[mini_batch]
Mini_Train_Result=self.Result[mini_batch]
gradient_increasement=[]
for (data,result) in zip(Mini_Train_Data,Mini_Train_Result):
g=(result-data.dot(self,Theta))*data
gradient_increasement.append(g)
avg_g=np.average(gradient_increasement,0)
avg_g=avg_g.reshape((len(avg_g),1))
self.Theta=self.Theta+alpha*avg_g
'''
迭代训练函数
'''
def train_BGD(self,iter,alpha):
'''
利用BGD算法迭代优化的函数
:param self:
:param iter: 迭代次数
:param alpha: 优化率
:return:
'''
Cost=[]
for i in range(iter):
self.BGD(alpha)
Cost.append(self.Cost())
Cost=np.array(Cost)
return Cost
def train_SGD(self,iter,alpha):
'''
利用SGD算法迭代优化的函数
:param self:
:param iter:
:param alpha:
:return:
'''
Cost = []
for i in range(iter):
self.SGD(alpha)
Cost.append(self.Cost())
Cost = np.array(Cost)
return Cost
def train_MBGD(self,iter,batch_size,alpha):
'''
利用MBGD算法迭代优化的函数
:param self:
:param iter:
:param batch_size:
:param alpha:
:return:
'''
Cost = []
for i in range(iter):
self.MBGD(alpha)
Cost.append(self.Cost())
Cost = np.array(Cost)
return Cost
'''
正则方程函数
'''
def getNormalEquation(self):
'''
利用正则方程计算模型参数self.Theta
:param self:
:return:
'''
col,rol=np.shape(self.InputData.T)
XT=self.InputData.T+0.001*np.eye(col,rol)
import numpy as np
def _init_(self,train_data,train_result):
'''
:param self:
:param train_data: 输入训练数据
:param train_result: 训练数据真实结果
:return:
'''
row,col=np.shape(train_data)
self.Train_Data=[0]*row
for(index,data) in enumerate(train_data):
Data=[1.0]
Data.extend(list(data))
self.Train_Data[index]=Data
self.Train_Data=np.array(self.Train_Data)
self.Train_Result=train_result
self.weight=np.zeros((row,row))
self.Theta=[]
def Gaussian_Weight(self,data,k):
'''
计算测试权重的函数
:param self:
:param data: 输入数据
:param k: 带宽系数
:return:
'''
sum=np.sum(data*data)
return np.exe(sum/(-2.0*k**2))