吴恩达机器学习第一次作业代码(多特征值线性归化)

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

'''
多特征值问题线性回归
'''
# 1.准备数据阶段
# 数据路径(字符串前加 r 表示对字符串去转义化)
path = r'E:/Code/machine learning/ex1data2.txt'
# 引入数据(header 指定某行为标题,默认为0,此处设置为None,无标题)
data = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
# 特征归一化,使用标准差
data = (data - data.mean())/data.std()
#print(data.head(-1))
# 插入ones列
data.insert(0, 'ones', 1)
#print(data.head())
# 获取列数
cols = data.shape[1]
# 使用iloc根据位置获取X(cols * 2)矩阵和Y(cols * 1)矩阵输入向量
x = data.iloc[:, 0:cols -1]
y = data.iloc[:, cols-1:cols]
X = np.matrix(x.values)
Y = np.matrix(y.values)
# 初始化theta矩阵
theta = np.matrix([0, 0, 0])
# print(Y)
# print(theta)
# 2.代价函数
def computeCost(x, y, theta):
    '''
    :param x: 输入矩阵
    :param y:目标矩阵
    :param theta:参数
    :return:
    '''
    inner = np.power(((x * theta.T) - y), 2)
    cost = np.sum(inner) / (2 * len(x))
    return cost

# 3.梯度下降
def gradientDescent(x, y, theta, alpha, epoch):
    '''

    :param x: 输入矩阵
    :param y: 目标矩阵
    :param theta: 参数
    :param alpha: 学习率
    :param epoch: 迭代次数
    :return:
    '''
    cost = np.zeros(epoch) # len(epoch) * 1代价矩阵,存放每次训练后的cost
    theta_temp = np.zeros(theta.shape) # 初始化一个临时矩阵变量
    parameters_num = int(theta.flatten().shape[1])  # 得到theta中的参数个数
    counterTheta = np.zeros((epoch, 3))
    m = x.shape[0]   # 样本个数
    for i in range(epoch):
        theta_temp = theta - (alpha / m) * (x * theta.T - y).T * x
        theta = theta_temp  # 更新参数
        counterTheta[i] = theta
        cost[i] = computeCost(x, y, theta)
    return counterTheta, theta, cost
# 3.绘制拟合函数图和代价函数图
alpha = 0.01
epoch = 3800
counterTheta, final_theta, cost = gradientDescent(X, Y, theta, alpha, epoch)
a = computeCost(X, y, final_theta)
print(f'最终代价:{a}')
fig, ax = plt.subplots(figsize = (8, 4))
ax.plot(np.arange(epoch), cost, 'r')
ax.set_xlabel('Iteration')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

数据集:

2104,3,399900
1600,3,329900
2400,3,369000
1416,2,232000
3000,4,539900
1985,4,299900
1534,3,314900
1427,3,198999
1380,3,212000
1494,3,242500
1940,4,239999
2000,3,347000
1890,3,329999
4478,5,699900
1268,3,259900
2300,4,449900
1320,2,299900
1236,3,199900
2609,4,499998
3031,4,599000
1767,3,252900
1888,2,255000
1604,3,242900
1962,4,259900
3890,3,573900
1100,3,249900
1458,3,464500
2526,3,469000
2200,3,475000
2637,3,299900
1839,2,349900
1000,1,169900
2040,4,314900
3137,3,579900
1811,4,285900
1437,3,249900
1239,3,229900
2132,4,345000
4215,4,549000
2162,4,287000
1664,2,368500
2238,3,329900
2567,4,314000
1200,3,299000
852,2,179900
1852,4,299900
1203,3,239500

运行结果(cost梯度下降图)

 参考链接:

吴恩达机器学习课后作业Python实现(一):线性回归_cols = data.shape[1]-CSDN博客

最详细吴恩达课后作业Python实现_吴恩达课后习题(python实现)-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值