递推最小二乘法——python程序

算法引用的数据为python自带的波士顿房价数据。代码如下:

# data 第一列为标记值
# data 后几列为特征向量
# initialTheta 为需要求得的theta
import numpy as np
import sklearn.datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib as mpl
import matplotlib.pyplot as plt
import warnings

###################
## data 第一列为真值,后面所有列为特征
## initialTheta 估算的权值初值
## featureNum 特征的个数
def RLS_Fun(data, initialTheta, featureNum):
    Theta = initialTheta
    P = 10 ** 6 * np.eye(featureNum)
    lamda = 1
    for i in range(len(data)):
        featureMatrix = data[i][1:]
        featureMatrix = featureMatrix.reshape(featureMatrix.shape[0], 1)
        y_real = data[i][0]
        K = np.dot(P, featureMatrix) / (lamda + np.dot(np.dot(featureMatrix.T, P), featureMatrix))
        Theta = Theta + np.dot(K, (y_real - np.dot(featureMatrix.T, Theta)))
        P = np.dot((np.eye(featureNum) - np.dot(K, featureMatrix.T)), P)
    return Theta


if __name__ == '__main__':
    warnings.filterwarnings(action='ignore')
    dataInitial = sklearn.datasets.load_boston()
    x = np.array(dataInitial.data)
    y = np.array(dataInitial.target)
    y = y.reshape((y.shape[0], 1))
    x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=0)
    data = np.concatenate((y_train, x_train), axis=1)
    featureNum = np.shape(x)[1]  # 有几个特征
    initialTheta = 0.5 * np.ones((featureNum, 1))
    Theta = RLS_Fun(data, initialTheta, featureNum)
    y_pred = np.dot(x_test, Theta)
    mse = mean_squared_error(y_test, y_pred)
    print('均方误差:', mse)
    t = np.arange(len(y_pred))
    mpl.rcParams['font.sans-serif'] = ['simHei']
    mpl.rcParams['axes.unicode_minus'] = False
    plt.figure(facecolor='w')
    plt.plot(t, y_test, 'r-', lw=2, label='真实值')
    plt.plot(t, y_pred, 'g-', lw=2, label='估计值')
    plt.legend(loc='best')
    plt.title('波士顿房价预测', fontsize=18)
    plt.xlabel('样本编号', fontsize=15)
    plt.ylabel('房屋价格', fontsize=15)
    plt.grid()
    plt.show()

 

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是几个递推最小二乘法Python程序: 1. 递推最小二乘法(TLS)的基本实现: ```python import numpy as np def TLS(X, y): """ 递推最小二乘法(TLS)的基本实现 X: 数据矩阵 y: 目标向量 """ n, p = X.shape Q = np.zeros((n, n)) R = np.zeros((p, p)) b = np.zeros(p) for i in range(n): # 递推公式 x = X[i, :] q = x - np.dot(Q[:i, :].T, x) Q[i, :] = q / np.linalg.norm(q) b += y[i] * Q[i, :] R += np.outer(Q[i, :], x) theta = np.linalg.solve(R, b) return theta ``` 2. 递推最小二乘法(TLS)的改进实现: ```python import numpy as np def TLS(X, y): """ 递推最小二乘法(TLS)的改进实现 X: 数据矩阵 y: 目标向量 """ n, p = X.shape Q = np.zeros((n, n)) R = np.zeros((p, p)) b = np.zeros(p) for i in range(n): # 递推公式 x = X[i, :] q = x - np.dot(Q[:i, :].T, x) r = np.linalg.norm(q) if r > 1e-12: Q[i, :] = q / r b += y[i] * Q[i, :] R += np.outer(Q[i, :], x) theta = np.linalg.solve(R, b) return theta ``` 3. 递推最小二乘法(TLS)的加速实现: ```python import numpy as np def TLS(X, y): """ 递推最小二乘法(TLS)的加速实现 X: 数据矩阵 y: 目标向量 """ n, p = X.shape Q = np.zeros((n, n)) R = np.zeros((p, p)) b = np.zeros(p) for i in range(n): # 递推公式 x = X[i, :] q = x - np.dot(Q[:i, :].T, x) r = np.linalg.norm(q) if r > 1e-12: Q[i, :] = q / r b += y[i] * Q[i, :] for j in range(i): qj = Q[j, :] R[j, :] += qj * np.dot(qj, x) R[i, :] = r * q theta = np.linalg.solve(R, b) return theta ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值