房价预测题

直线是y=k*x+b
用如下代码随机出两个值并附给k和b

k = random.randint(0, 50)

b = random.randint(-50, 50)

最后对应求y的函数就应该是

def y_guess(k, x, b):

      return k * x + b

第二步

 

随便画出一个图形肯定与数据相差大

效果不理想,引入损失函数

L2Loss​=n(Ytrue−Yhat)2

损失函数越大代表线预测的越差。

函数实现:

# 求损失

def l2_loss(y_ture, y_guess):

    return np.mean((np.array(y_ture) - np.array(y_guess)) ** 2)

第三步

学习过程:

对损失函数求偏导。

把k和b当作变量分别对k,b求偏导。

b求偏导:

def partial_b(y_ture, y_guess):

    return -2 * np.mean((np.array(y_ture) - np.array(y_guess)))

k求偏导:

def partial_k(y_ture, y_guess, x):

return -2 * np.mean((np.array(y_ture) - np.array(y_guess)) * np.array(x))

完整函数

from sklearn.datasets import load_boston

import matplotlib.pyplot as plt

import random

import numpy as np

data = load_boston()

X, Y = data['data'], data['target']

room_index = 5

X_rm = X[:, room_index]

print(X.shape)

def partial_k(y_ture, y_guess, x):

    return -2 * np.mean((np.array(y_ture) - np.array(y_guess)) * np.array(x))

def partial_b(y_ture, y_guess):

    return -2 * np.mean((np.array(y_ture) - np.array(y_guess)))

def l2_loss(y_ture, y_guess):

    return np.mean((np.array(y_ture) - np.array(y_guess)) ** 2)

def y_guess(k, x, b):

    return k * x + b

trying_time = 20000

min_loss = float('inf')

best_k, best_b = None, None

learning_rate = 1e-4

k = random.randint(0, 50)

b = random.randint(-50, 50)

pltfigure()

plt.scatter(X_rm, Y, color='red', alpha=0.5)

plt.figure()

plt.scatter(X_rm, Y, color='red', alpha=0.5)

plt.plot(X_rm, y_guess(k, X_rm, b), color='green')

plt.show()

forin range(trying_time):

        yhat = y_guess(k, X_rm, b)

    L2_loss = l2_loss(Y, yhat)

    if L2_loss < min_loss:

        best_k = k

        best_b = b

        min_loss = L2_loss

    k = k - partial_k(Y, yhat, X_rm) * learning_rate

    b = b - partial_b(Y, yhat) * learning_rate

print('L2loss=', min_loss)

plt.scatter(X_rm, Y, color='red')

plt.plot(X_rm, y_guess(best_k, X_rm, best_b), color='blue')

print('y = {} * x {}'.format(best_k, best_b))

plt.show()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值