#编写误差计算函数 #利用函数读取abalone.txt数据,并训练LWLR模型,比较不同k值下,模型在训练样本上的误差值
时间: 2024-02-25 07:57:26 浏览: 99
聚类算法e-project-mdemo
好的,我可以为您编写一个误差计算函数。
```python
import numpy as np
def compute_error(y_true, y_pred):
"""
计算真实值和预测值之间的平均误差
:param y_true: 真实值
:param y_pred: 预测值
:return: 平均误差
"""
error = np.mean(np.abs(y_true - y_pred))
return error
```
关于利用函数读取数据并训练LWLR模型,您可以参考以下代码:
```python
import numpy as np
import pandas as pd
# 读取数据
data = pd.read_csv('abalone.txt', delimiter='\t', header=None)
x = data.iloc[:, :-1].values # 特征
y = data.iloc[:, -1].values # 标签
# 对特征进行归一化处理
x = (x - np.mean(x, axis=0)) / np.std(x, axis=0)
# 定义LWLR模型
def lwlr(test_point, x_train, y_train, k=1.0):
"""
局部加权线性回归
:param test_point: 测试点
:param x_train: 训练集特征
:param y_train: 训练集标签
:param k: 高斯核的带宽参数
:return: 预测值
"""
x_train = np.mat(x_train)
y_train = np.mat(y_train).T
m = np.shape(x_train)[0]
weights = np.mat(np.eye((m)))
for j in range(m):
diff_mat = test_point - x_train[j, :]
weights[j, j] = np.exp(diff_mat * diff_mat.T / (-2.0 * k ** 2))
xTx = x_train.T * (weights * x_train)
if np.linalg.det(xTx) == 0.0:
print('This matrix is singular, cannot do inverse')
return
ws = xTx.I * (x_train.T * (weights * y_train))
return test_point * ws
# 训练LWLR模型
k_values = [0.1, 1, 10]
for k in k_values:
y_pred = []
for i in range(len(x)):
y_pred.append(float(lwlr(x[i], x, y, k)))
error = compute_error(y, y_pred)
print('k={}, error={:.2f}'.format(k, error))
```
这段代码中,我们读取了 abalone.txt 数据,并进行了特征归一化处理。然后定义了 LWLR 模型,使用不同的 k 值训练模型,并计算模型在训练集上的平均误差。
阅读全文