# python数学方法实现一元线性拟合

代码如下:
(含部分注释)

import numpy as np
import matplotlib.pyplot as plt

#define data
x = np.array([0.5,1.0,1.5,2.0])
y = np.array([1.75,2.45,3.81,4.00])
plt.scatter(x,y)

#define needs in calculate
s1 = 0
s2 = 0
s3 = 0
s4 = 0
#len(x) 与 s 的个数要对应上,len(x) == 4 ,就应该有 4 个 s
n = 4

#最小二乘法公式()
for i in range(n):
    s1 = s1 + x[i]*y[i]
    s2 = s2 + x[i]
    s3 = s3 + y[i]
    s4 = s4 + x[i]*x[i]
#calculate coeff(斜率) and intercept(截距)
b = (s2*s3-n*s1) /  (s2*s2-s4*n)
a = (s3 - b*s2) / n
print("coeff:{} intercept:{}".format(b,a))

x = np.linspace(0,4,4)
y = b*x + a
plt.plot(x,y)
plt.show()

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 一元线性回归是指只有一个自变量和一个因变量之间的线性关系。下面是Python手写代码实现一元线性回归的步骤: 1. 导入必要的库 ```python import numpy as np import matplotlib.pyplot as plt ``` 2. 定义数据集 ```python x = np.array([1, 2, 3, 4, 5]) y = np.array([3, 5, 7, 9, 11]) ``` 3. 计算相关系数和斜率 ```python r = np.corrcoef(x, y)[0, 1] slope = r * np.std(y) / np.std(x) ``` 4. 计算截距 ```python intercept = np.mean(y) - slope * np.mean(x) ``` 5. 绘制散点图和回归线 ```python plt.scatter(x, y) plt.plot(x, slope * x + intercept, color='red') plt.show() ``` 完整代码如下: ```python import numpy as np import matplotlib.pyplot as plt # 定义数据集 x = np.array([1, 2, 3, 4, 5]) y = np.array([3, 5, 7, 9, 11]) # 计算相关系数和斜率 r = np.corrcoef(x, y)[0, 1] slope = r * np.std(y) / np.std(x) # 计算截距 intercept = np.mean(y) - slope * np.mean(x) # 绘制散点图和回归线 plt.scatter(x, y) plt.plot(x, slope * x + intercept, color='red') plt.show() ``` 输出结果为: ![一元线性回归](https://i.imgur.com/8K7Rr5d.png) ### 回答2: 一元线性回归是机器学习领域中最基本的模型之一,它可以通过一条直线来对数据集进行拟合。在本文中,我们将使用Python手写代码实现一元线性回归。 1. 数据导入与处理 首先,我们需要将我们的数据集导入到Python中,并对其进行必要的处理。在这里,我们将使用pandas库来读取我们的数据集,并且进行简单的数据清理。我们可以使用如下代码实现: ```python import pandas as pd import numpy as np data = pd.read_csv('data.csv') # 读取数据集 data = data.dropna() # 清理数据 ``` 2. 可视化数据集 对于机器学习问题,可视化数据集是非常重要的。我们需要将数据集可视化后,才能更好地理解其内部结构,并选择合适的模型进行训练。在这里,我们将使用matplotlib库来进行数据可视化操作。可以使用如下代码实现: ```python import matplotlib.pyplot as plt plt.scatter(data['x'], data['y']) plt.xlabel('x') plt.ylabel('y') plt.show() ``` 3. 分离训练集和测试集 接下来,我们需要将我们的数据集分离成训练集和测试集。在这里,我们将使用sklearn库来实现数据集分割的操作。可以使用如下代码实现: ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(data['x'], data['y'], test_size=0.2) ``` 4. 定义模型 我们使用线性回归模型进行训练。在这里,我们将使用numpy库实现模型定义和训练过程。可以使用如下代码实现: ```python class LinearRegression: def __init__(self): self.w = None def fit(self, X, y): X = np.insert(X[:, np.newaxis], 0, 1, axis=1) y = y[:, np.newaxis] self.w = np.linalg.inv(X.T @ X) @ X.T @ y def predict(self, X): X = np.insert(X[:, np.newaxis], 0, 1, axis=1) return X @ self.w ``` 5. 训练模型 现在,我们拥有了一个可以对数据集进行训练的模型。在这里,我们将使用我们定义的模型进行训练,并且输出训练集上的误差。可以使用如下代码实现: ```python model = LinearRegression() model.fit(X_train, y_train) y_train_pred = model.predict(X_train) train_error = np.sqrt(np.mean((y_train_pred - y_train) ** 2)) print('Training error:', train_error) ``` 6. 模型评价 最后,我们还需要对我们的模型进行评价。我们将使用模型在测试集上的误差来评价模型的性能。可以使用如下代码实现: ```python y_test_pred = model.predict(X_test) test_error = np.sqrt(np.mean((y_test_pred - y_test) ** 2)) print('Testing error:', test_error) ``` 至此,我们已经完成了通过Python手写代码实现一元线性回归的全部步骤。 ### 回答3: 线性回归是一种基本的机器学习算法,常用于预测问题。在该算法中,我们需要找到一个线性函数 y=wx+b,其中x为自变量,y为因变量,w和b为常量,使得该函数最好地拟合样本数据。 下面是用Python手写一元线性回归的几个步骤: 1. 导入需要的库:numpy和matplotlib 2. 准备样本数据,这里我们用numpy生成类似y=2*x+1的数据。 ```python import numpy as np import matplotlib.pyplot as plt x_data = np.linspace(0, 1, 100) y_data = 2 * x_data + 1 + np.random.randn(*x_data.shape) * 0.4 plt.scatter(x_data, y_data) plt.show() ``` 生成的样本数据如下图所示: ![image.png](https://cdn.nlark.com/yuque/0/2022/png/973285/1668347562338-f8a720d2-ddb8-4620-8fcb-7d4939263df6.png#clientId=u71506cba-7a7b-4&from=paste&id=u534bbb9d&margin=%5Bobject%20Object%5D&originHeight=222&originWidth=304&originalType=binary&ratio=1&size=5757&status=done&style=none&taskId=u75eb23c2-5d62-420c-a056-0b42d54eb6c&width=304) 3. 定义损失函数,这里我们使用均方误差(MSE)作为损失函数。 ```python def mse_loss(y_pred, y_true): return np.mean(np.square(y_pred - y_true)) ``` 4. 训练模型。下面的代码中,初始化w和b为随机值,然后使用梯度下降法更新参数w和b,直到损失收敛。 ```python # 初始化w和b w = np.random.randn() b = np.random.randn() # 设置超参数 learning_rate = 0.1 n_iters = 100 # 训练模型 for i in range(n_iters): # 前向传播 y_pred = w * x_data + b # 计算损失 loss = mse_loss(y_pred, y_data) # 反向传播 dw = np.mean((y_pred - y_data) * x_data) db = np.mean(y_pred - y_data) # 更新参数 w -= learning_rate * dw b -= learning_rate * db # 打印损失 print('Epoch {}/{} - loss: {:.4f}'.format(i+1, n_iters, loss)) ``` 5. 可视化结果,比较预测值和真实值之间的差异。 ```python # 可视化预测值和真实值 y_pred = w * x_data + b plt.scatter(x_data, y_data, alpha=0.5, label='data') plt.plot(x_data, y_pred, 'r', label='predicted') plt.legend() plt.show() ``` 最终得到的可视化结果如下图所示: ![image.png](https://cdn.nlark.com/yuque/0/2022/png/973285/1668347614692-253bad25-90b2-4f52-baff-9be9789e08d7.png#clientId=u71506cba-7a7b-4&from=paste&id=u4d140f7d&margin=%5Bobject%20Object%5D&originHeight=222&originWidth=304&originalType=binary&ratio=1&size=3942&status=done&style=none&taskId=u75eb23c2-5d62-420c-a056-0b42d54eb6c&width=304) 通过手写代码实现一元线性回归,可以深入理解线性回归的原理和实现过程。同时,也可以便于对算法进行个性化定制和扩展,满足各种不同的业务需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值