1.简单的线性回归算法

 
'''
    @author yokan
    @date 2018/5/15
'''
#简单的线性回归算法
import math
import numpy as np
import matplotlib.pyplot as pl

#暂时无用,这是sklearn框架做线性回归的算法,框架学习在后面,我准备先学算法
from sklearn.linear_model import LinearRegression
from mpl_toolkits.mplot3d import axes3d

#1.从linear_regression_data1导入数据
data = np.loadtxt("linear_regression_data1.txt",delimiter=",")   #delimiter 以,分割成矩阵
print(data)
#2.把数据拆分成两列方便后面的计算
x = np.c_[np.ones(data.shape[0]),data[:,0]]                    #np.ones(data.shape[0])在前面是没用的,是求内积的时候纬度不够的时候用的
y = np.c_[data[:,1]]                                           #把txt中的数据拆分成x,y两列,加一列1,后面求内积
#我也很好奇为啥要加一列1,不是1,2,3,4,5以下是我个人的理解:
#我们求的theta最终应该是这种形式的y = θ(0)*1 + θ(1)*(x1)^i + θ(2)*(x2)^i ...所以theta0对应的就是1

#3求损失函数 公式为(1/2*m)*(sum(h(x(i)) - y(i)))^2
def getlossMethod(x,y,theta = [[0],[0]]):      #theta 默认值给0
    m = len(y)              #m为
    h = x.dot(theta)        #x和theta的内积就是h
    loss_v = 1/2*m*sum(math.sqrt(h-y))     #基本就是求预估值h和y的差值,直到这个值近似于0那么这两个值就基本相似了
    return loss_v

#4求出具体的theta
def gettheta(x,y,theta = [[0],[0]],r_count = 1500,alpha = 0.01):          #这是一个梯度下降的问题,多试几次才会接近完美的值,这里就试1500次,alpha为学习效率
    m = len(y)
    for i in range(r_count):
        h = x.dot(theta)
        theta = theta - alpha*(1/m)* (x.T.dot(h - y))                       #梯度下降的算法 = theta - alpha*(1/m)*(偏微分(损失函数)
    return theta
#5画图
theta = gettheta(x,y)
xx = np.arange(5, 23)
yy = theta[0] + theta[1]*xx                                         # 根据画图框架需求的数据得出x和y轴方向的值
pl.scatter(x[:, 1], y, s=30, c='r', marker='x', linewidths=1)       # 画出数据的散点图
pl.plot(xx, yy)       # 画出梯度下降的收敛线
# pl.show()                                                           # 展示
#6调试写的算法,这里为止从学习角度来说算学习完了
print(theta.T.dot([1, 3.5])*10000)                                  #测试,很多种方式可以测试,我就按7月的方式弄了
print(theta.T.dot([1, 7])*10000)
#得出的结果可以算是期望



#以下注释的为sklearn求线性回归的代码,学到框架再回来重新弄
# regr = LinearRegression()
# regr.fit(X[:,1].reshape(-1,1), y.ravel())
# plt.plot(xx, regr.intercept_+regr.coef_*xx, label='Linear regression (Scikit-learn GLM)')
#
# plt.xlim(4,24)
# plt.xlabel('Population of City in 10,000s')
# plt.ylabel('Profit in $10,000s')
# plt.legend(loc=4);


"""
 @Time    : 2018/6/26
 @Author  : yokan
"""
#以下是用吴恩达的逻辑写出来的
import numpy as np
import matplotlib.pyplot as plt
alpha = 0.01  #学习率
gradient_descent_count = 2000 #梯度下降1500次
data = np.loadtxt('l_data.txt',delimiter=',')
x = np.c_[np.ones((data.shape[0],1)),data[:,0]]
y = data[:,1].reshape((-1,1)) #站起来,别趴下
m = data.shape[0]
#定义损失函数
def lossfunction(theta):
    h_theta = x.dot(theta) #矩阵乘法
    loss_v = 1/(2*m)*np.sum(np.square(h_theta - y))
    return loss_v

def gradient_descent(theta = np.array([[0.0],[0.0]]),loss_values = []):
    for i in range(gradient_descent_count):
        h_theta = x.dot(theta)
        temp1 = theta[0,:][0] - alpha * 1 / m * np.sum(h_theta - y)
        temp2 = theta[1,:][0] - alpha * 1 / m * np.sum(x.T.dot((h_theta - y)))
        theta[0,:][0] = temp1
        theta[1,:][0] = temp2
        loss_values.append([lossfunction(theta),i])
    return theta,np.array(loss_values)

theta , loss_values = gradient_descent()
# plt.plot(loss_values[:,1],loss_values[:,0],c = 'blue')
# plt.show()            #查看梯度下降情况
plt.scatter(x[:,1],y,c='r',s = 10)
x_arr = np.arange(0,23,0.1)
y_arr = x_arr * theta[1,:][0] + theta[0,:][0]   #y = ax + b
plt.plot(x_arr,y_arr,c='black')
plt.show()

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 线性回归的原理和方法: 线性回归是一种用于建立变量之间线性关系的统计模型。它基于以下假设:自变量和因变量之间存在线性关系,并且误差项服从正态分布。线性回归模型可以表示为:Y = β0 + β1X1 + β2X2 + ... + βnXn + ε,其中Y是因变量,X1, X2, ..., Xn是自变量,β0, β1, β2, ..., βn是回归系数,ε是误差项。 线性回归的方法包括两个主要步骤:模型训练和模型评估。 - 模型训练:通过最小化残差平方和来估计回归系数。最常用的方法是最小二乘法,即找到使得残差平方和最小的回归系数。这可以通过求解正规方程或使用梯度下降等优化算法来实现。 - 模型评估:通过评估模型的性能来确定模型的准确性和可靠性。常用的评估指标包括均方误差(MSE)、决定系数(R-squared)等。 2. 线性回归模型的训练方法: 线性回归模型的训练方法主要有两种:最小二乘法和梯度下降法。 - 最小二乘法:最小二乘法是一种通过最小化残差平方和来估计回归系数的方法。它通过求解正规方程来得到回归系数的闭式解。正规方程是一个线性方程组,可以直接求解得到回归系数的值。 - 梯度下降法:梯度下降法是一种通过迭代优化算法来估计回归系数的方法。它通过计算损失函数关于回归系数的梯度,并沿着梯度的反方向更新回归系数,逐步减小损失函数的值。梯度下降法有两种变体:批量梯度下降和随机梯度下降。批量梯度下降在每次迭代中使用所有样本来更新回归系数,而随机梯度下降在每次迭代中只使用一个样本来更新回归系数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值