机器学习_python实现线性回归代码解析

首先我们要确保已经知道了线性回归的基本知识,如果不知道的话,请看:机器学习_线性回归

数据下载:链接:https://pan.baidu.com/s/1H04W5R6asmwGisDkpDHTqA 密码:jgba

首先我们先看一下数据:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def getDataSet():
    path = 'ex1data1.txt'
    data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
    data.plot(kind = 'scatter',x = 'Population',y = 'Profit',figsize = (8,6))
    plt.show()

if __name__ == '__main__':
    getDataSet()

然后我们就开始拟合直线

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def getDataSet():
    '''
    函数说明:得到数据集
    :return:
            X:得到的X坐标
            y:得到的y坐标
    '''
    path = 'ex1data1.txt'
    data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
    data.insert(0,'Ones',1)
    cols = data.shape[1]         #得到数据集的列数
    X = data.iloc[:,0:cols-1]    #获得X坐标
    y = data.iloc[:,cols-1:cols]  #获得y坐标
    return X,y

def getCost(X, y ,theta):
    '''
    函数说明:代价函数计算数值
    :param X: 训练集
    :param y: X对应的y值
    :param theta: theta值
    :return:
            代价函数得到的数值
    '''
    inner = np.power((X*theta.T) - y,2)
    return 1/(2*len(X)*sum(inner))

def gradientDescent(X, y ,theta, alpha, iters):
    '''
    函数说明:根据梯度下降,计算出最适应的theta值
    :param X: 训练集
    :param y: X对应的y值
    :param theta: 需要更新的theta值
    :param alpha: 学习速率
    :param iters:循环更新次数
    :return:
            theta:最终更新好的theta值
            cost:根据代价函数,求得的误差
    '''
    temp = np.mat(np.zeros(theta.shape))    #新建一个相同的theta对象,每次都先更新temp,然后再赋值
    cost = np.zeros(iters)
    parameters = int (theta.shape[1])     #得到theta的个数

    for  i in range(iters):               #循环更新的次数
        error = X*theta.T - y
        for j in range(parameters):       #每次更新一个theta值,这样更能体现出那样一个求和的过程
            term = np.multiply(error,X[:,j])
            temp[0,j] = theta[0,j] - alpha / len(X) * sum(term)
        theta = temp
        cost[i] = getCost(X,y,theta)
    return  theta,cost


if __name__ == '__main__':
    X,y = getDataSet()
    alpha = 0.01   #学习速率
    theta = np.mat(np.array([0,0]))   #将array转换为matrix,表示:theta
    X = np.mat(X)
    y = np.mat(y)
    iters = 1000
    theta,cost = gradientDescent(X,y,theta,alpha,iters)
    x = np.linspace(X[:,1].min(),X[:,1].max(),100)
    f = theta[0,0] + (theta[0,1] * x)
    
    fig,ax = plt.subplots(figsize = (8,6))
    ax.plot(x,f,'r',label = 'Prediction')
    ax.scatter(np.array(X[:,1]),np.array(y[:,0]),label = 'Training Data')
    ax.legend(loc = 'best')
    ax.set_xlabel('Population')
    ax.set_ylabel('Profit')
    ax.set_title('Predicted Profit vs. Population Size')
    plt.show()

我们也可以将代价函数的变化的图像画下来:

fig,ax = plt.subplots(figsize = (8,6))
    ax.plot(np.arange(iters),cost,'r')
    plt.show()

上面那种写法更容易被理解一些,但是我们如果直接用矩阵的乘法的话,可以省掉里面的那一层循环,更加便捷一些,因为矩阵相乘的过程就包含相加的过程。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def getDataSet():
    '''
    函数说明:得到数据集
    :return:
            X:得到的X坐标
            y:得到的y坐标
    '''
    path = 'ex1data1.txt'
    data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
    data.insert(0,'Ones',1)
    cols = data.shape[1]         #得到数据集的列数
    X = data.iloc[:,0:cols-1]    #获得X坐标
    y = data.iloc[:,cols-1:cols]  #获得y坐标
    return X,y

def getCost(X, y ,theta):
    '''
    函数说明:代价函数计算数值
    :param X: 训练集
    :param y: X对应的y值
    :param theta: theta值
    :return:
            代价函数得到的数值
    '''
    inner = np.power(((X*theta.T) - y),2)
    return np.sum(inner)/(2*len(X))

def gradientDescent(X, y ,theta, alpha, iters):
    '''
    函数说明:根据梯度下降,计算出最适应的theta值
    :param X: 训练集
    :param y: X对应的y值
    :param theta: 需要更新的theta值
    :param alpha: 学习速率
    :param iters:循环更新次数
    :return:
            theta:最终更新好的theta值
            cost:根据代价函数,求得的误差
    '''
    cost = np.zeros(iters)
    parameters = int (theta.shape[1])     #得到theta的个数

    for  i in range(iters):               #循环更新的次数
        error = X*theta.T - y
        theta =theta - (alpha *  error.T * X)/len(X)
        cost[i] = getCost(X,y,theta)
    return  theta,cost


if __name__ == '__main__':
    X,y = getDataSet()
    alpha = 0.01   #学习速率
    theta = np.mat(np.array([0,0]))   #将array转换为matrix,表示:theta
    X = np.mat(X)
    y = np.mat(y)
    iters = 1000
    theta,cost = gradientDescent(X,y,theta,alpha,iters)
    x = np.linspace(X[:,1].min(),X[:,1].max(),100)
    f = theta[0,0] + (theta[0,1] * x)
    fig,ax = plt.subplots(figsize = (8,6))
    ax.plot(x,f,'r',label = 'Prediction')
    ax.scatter(np.array(X[:,1]),np.array(y[:,0]),label = 'Training Data')
    ax.legend(loc = 'best')
    ax.set_xlabel('Population')
    ax.set_ylabel('Profit')
    ax.set_title('Predicted Profit vs. Population Size2')
    plt.show()

结果和上面的相同:


代价函数也是相同的


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于使用 Python 实现线性回归算法,我可以给你一些基本的思路和代码实现。 首先,线性回归是一种用于建立两个变量之间线性关系的统计学方法。在机器学习中,我们通常使用线性回归来进行预测。下面是一个简单的例子。 假设我们有一个数据集,其中包含了房屋的面积和价格。我们想要通过这个数据集来预测房屋的价格。首先,我们需要将数据集导入到 Python 程序中,可以使用 Pandas 库来读取 CSV 文件。 ``` import pandas as pd data = pd.read_csv('data.csv') ``` 接着,我们需要将数据集分成两个部分:训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。 ``` from sklearn.model_selection import train_test_split train_data, test_data = train_test_split(data, test_size=0.2) ``` 然后,我们需要定义一个模型,用于预测房屋的价格。在这里,我们使用 scikit-learn 库提供的线性回归模型。 ``` from sklearn.linear_model import LinearRegression model = LinearRegression() ``` 接着,我们需要将训练集的特征和标签分开,并用它们来训练模型。 ``` X_train = train_data[['area']] y_train = train_data[['price']] model.fit(X_train, y_train) ``` 最后,我们可以使用测试集来评估模型的性能。 ``` X_test = test_data[['area']] y_test = test_data[['price']] score = model.score(X_test, y_test) ``` 这里的 score 表示模型的拟合程度,越接近 1 表示模型的性能越好。 以上就是使用 Python 实现线性回归算法的基本思路和代码实现。当然,实际应用中还有很多细节需要注意,例如特征工程、数据清洗等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值