利用numpy实现梯度下降预测疾病

本文介绍如何使用Python的NumPy库实现梯度下降算法,通过BMI和疾病发展数据预测疾病,展示了从数据加载到模型训练及结果可视化全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"""
    实战案例1:利用NumPy实现梯度下降算法预测疾病
    任务:根据体重指数(BMI)和疾病发展的定量测量值(Y)使用梯度下降算法拟合出一条直线 y_hat=aX+b
    数据集来源:http://sklearn.apachecn.org/cn/0.19.0/sklearn/datasets/descr/diabetes.html
"""
import numpy as np
import matplotlib.pylab as plt

Data_Path = 'F:/diabetes.csv'

def load_data(data_file):
    '''
    读取数据文件,加载数据
    参数:
        data_file:文件路径
        data_arr:数据的多维数组表示
    '''
    data_arr = np.loadtxt(data_file,delimiter=',',skiprows=1)
    return data_arr

def get_gradient(theta,x,y):
    m = x.shape[0]
    y_estimate = x.dot(theta)
    error = y_estimate - y
    grad = 1.0/m * error.dot(x)
    cost = 1.0/(2*m) * np.sum(error ** 2)
    return grad,cost

def gradient_descent(x,y,max_iter=1500,alpha=0.01):
    theta = np.random.randn(2)

    #收敛阈值
    tolerance = 1e-3

    # Perform Gradient Descent
    iterations = 1

    is_converged = False
    while not is_converged:
        grad,cost=get_gradient(theta,x,y)
        new_theta = theta - alpha * grad

        # Stopping Condition
        if np.sum(abs(new_theta-theta)) < tolerance:
            is_converged = True
            print("参数收敛")

        # Print error every 50 iterations
        if iterations % 10 == 0:
            print("第{}次迭代,损失值{:.4f}".format(iterations,cost))

        iterations += 1
        theta = new_theta

        if iterations > max_iter:
            is_converged = True
            print("已经到达最大迭代次数{}".format(max_iter))

    return theta

def main():
    '''
    主函数
    '''
    data_arr = load_data(Data_Path)
    x = data_arr[:,0].reshape(-1,1)
    # 添加一列全1的向量
    x = np.hstack((np.ones_like(x),x))
    y = data_arr[:,1]
    theta = gradient_descent(x,y,alpha=0.001,max_iter=200)
    print("线性模型参数:",theta)

    #绘制结果
    y_pred = theta[0] + theta[1] * x[:,1]
    plt.figure()
    #绘制样本点
    plt.scatter(x[:,1],y)

    #绘制拟合线
    plt.plot(x[:,1],y_pred,c = 'red')
    plt.show()

if __name__ == '__main__':
    main()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值