简单的线性回归(以x轴为住房面积,y轴为价格为例)

实现并探索单变量线性回归的成本函数。

以x轴为住房面积,y轴为价格为例,进行线性回归的预测单变量:

其中真实的数据如图分布为散点,而用过线性回归进行预测,那么预测的数据应是一条直线如图

通过上面的两个公式可以进行预测

第一个方程是计算预测后的损失值的,损失值越小越好,表示性能优

第二个方程是线性回归的预测方程,w和b是一个偏一两,在后面的算法优化中会计算出w和b

这里的w和b就随便填一个数(w = 1000 ,b = 500)

然后就进行计算预测值:

###线性回归的预测值:
###f_wb = x * w + b x和f_wb都是向量(数组)
def compute_model_output(x,w,b):
    m = x.shape[0]  ###获取x数组的大小
    f_wb = np.zeros(m)  ###创建一个f_wb数组大小为m,并且全置为0

    for i in range(m):
        f_wb[i] = x[i] * w + b

    return f_wb
''' 或者也可以这样写:
    f_wb = x * w + b
    :return f_wb
    这里是用numpy中的向量进行计算
'''

然后就是画图:

w,b = 1000,5000 ###这里假设w和b的值

###生成100个x,y的随机数,来进行预测

num_samples = 100
### x
x = np.random.uniform(10,300,num_samples)
### y
y = 1000 * x + np.random.normal(0,20000,num_samples)

###取前10个数
for i in range(10):
    print('square_meters: ', x[i], 'prices: ', y[i])

###画图:
###获取预测值
tmp_f_wb = compute_model_output(x,w,b)

plt.plot(x,tmp_f_wb,c = 'b',label='Prediction')
plt.scatter(x,y,marker = 'x',c = 'r',)
plt.ylabel('Prices (RMB)')
plt.xlabel('square_meters')
plt.show()

由于没有具体的数据这里的x和y的训练值就用随机数来进行训练

如果想看看预测后的损失值如何:
 

def compute_loss(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

输出

# 输出损失前的预测值(这里其实就是tmp_f_wb)
print("Prediction before loss calculation:")
for i in range(10):
    print(f'square_meters: {x[i]}, predicted prices: {tmp_f_wb[i]}')

# 计算损失
loss = compute_loss(y, tmp_f_wb)
print(f"Loss: {loss}")

可以看出损失值是很大的,why?,上面不是说要很小吗?

由于这个程序中使用的数据是随机生成的,因此损失值(即预测误差的平方的平均值)的大小是不确定的,并且可能在不同的运行之间变化很大。损失值的大小取决于随机生成的x(平方米数)和y(价格)之间的实际关系与模型假设的线性关系(y = w * x + b)之间的差异。

完整代码:(无损失值的):

import numpy as np
import matplotlib.pyplot as plt


###线性回归的预测值:
###f_wb = x * w + b x和f_wb都是向量(数组)
def compute_model_output(x,w,b):
    m = x.shape[0]  ###获取x数组的大小
    f_wb = np.zeros(m)  ###创建一个f_wb数组大小为m,并且全置为0

    for i in range(m):
        f_wb[i] = x[i] * w + b

    return f_wb
''' 或者也可以这样写:
    f_wb = x * w + b
    :return f_wb
    这里是用numpy中的向量进行计算
'''


w,b = 1000,5000 ###这里假设w和b的值

###生成100个x,y的随机数,来进行预测

num_samples = 100
### x
x = np.random.uniform(10,300,num_samples)
### y
y = 1000 * x + np.random.normal(0,20000,num_samples)

###取前10个数
for i in range(10):
    print('square_meters: ', x[i], 'prices: ', y[i])

###画图:
###获取预测值
tmp_f_wb = compute_model_output(x,w,b)

plt.plot(x,tmp_f_wb,c = 'b',label='Prediction')
plt.scatter(x,y,marker = 'x',c = 'r',)
plt.ylabel('Prices (RMB)')
plt.xlabel('square_meters')
plt.show()





结果:

有损失值:

###################
# HOUSING PRICES  #
###################

import numpy as np
import matplotlib.pyplot as plt


def compute_model_output(x, w, b):

    m = x.shape[0]  ###获取x数组的大小
    f_wb = np.zeros(m)  ###创建一个f_wb数组大小为m,并且全置为0
    for i in range(m):
        f_wb[i] = w * x[i] + b
    ''' or code:
    f_wb = w * x + b
    return f_wb
    '''
    return f_wb


def compute_loss(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)


num_samples = 100
# x means square_meters
x = np.random.uniform(10, 300, num_samples)
# y means prices
y = 1000 * x + np.random.normal(0, 20000, num_samples)
# output 1 ~ 10
for i in range(10):
    print('square_meters: ', x[i], 'prices: ', y[i])
# show plt.
# f(x) = w * x + b // here w = 1000, b = 500
w, b = 1000, 500
tmp_f_wb = compute_model_output(x, 1000, 500)

# 计算预测值
tmp_f_wb = compute_model_output(x, w, b)


# 输出损失前的预测值(这里其实就是tmp_f_wb)
print("Prediction before loss calculation:")
for i in range(10):
    print(f'square_meters: {x[i]}, predicted prices: {tmp_f_wb[i]}')

# 计算损失
loss = compute_loss(y, tmp_f_wb)
print(f"Loss: {loss}")


plt.plot(x, tmp_f_wb, c='b', label='Prediction')
plt.scatter(x, y, marker='x', c='r')
plt.title('Housing prices')
plt.ylabel('Prices (RMB)')
plt.xlabel('square_meters')
plt.show()

x_i = 1600
cost = w * x_i + b
print(f'{x_i} meters housing prices: ', cost)

以上就是刚开始学习机器学习的线性回归的初步成果(虽然是别人的,但自己理解后又写了一遍)

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值