要求不调用sklearn库且编写一个线性回归模型
时间: 2023-08-02 13:38:09 浏览: 134
好的,以下是使用adam算法实现线性回归的Python代码,不使用sklearn库:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入外部数据集
data = pd.read_csv('insurance.csv')
# 特征缩放
data = (data - data.mean()) / data.std()
# 添加一列常数1到X
X = data.drop(['charges'], axis=1)
X.insert(0, 'ones', 1)
# 初始化模型参数
theta = np.zeros(X.shape[1])
# 定义损失函数
def loss(X, y, theta):
m = len(y)
h = np.dot(X, theta)
return np.sum((h - y) ** 2) / (2 * m)
# 定义梯度函数
def gradient(X, y, theta):
m = len(y)
h = np.dot(X, theta)
return np.dot(X.T, h - y) / m
# 定义adam算法函数
def adam(X, y, theta, alpha=0.01, beta1=0.9, beta2=0.999, eps=1e-8, num_iters=1000):
m = len(y)
mt, vt = np.zeros_like(theta), np.zeros_like(theta)
for i in range(num_iters):
grad = gradient(X, y, theta)
mt = beta1 * mt + (1 - beta1) * grad
vt = beta2 * vt + (1 - beta2) * grad ** 2
mt_hat = mt / (1 - beta1 ** (i+1))
vt_hat = vt / (1 - beta2 ** (i+1))
theta -= alpha * mt_hat / (np.sqrt(vt_hat) + eps)
return theta
# 训练模型
y = data['charges']
theta = adam(X, y, theta)
# 预测结果
y_pred = np.dot(X, theta)
# 计算MSE
mse = np.sum((y_pred - y) ** 2) / len(y)
print('MSE:', mse)
# 可视化结果
plt.scatter(y, y_pred)
plt.xlabel('Actual Charges')
plt.ylabel('Predicted Charges')
plt.show()
```
在这个例子中,我们使用了特征缩放来标准化数据,然后添加了一列常数1到X,以便可以计算偏置项。然后我们初始化了模型参数theta,定义了损失函数和梯度函数,并实现了adam算法。最后,我们使用adam算法训练模型,并使用预测结果计算了MSE,并可视化了结果。
阅读全文