实现并探索单变量线性回归的成本函数。
以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)
以上就是刚开始学习机器学习的线性回归的初步成果(虽然是别人的,但自己理解后又写了一遍)