机器学习之简单线性回归

最广为人知的线性回归模型——将数据拟合成一条直线。直线拟合的模型方程为 y = ax + b,其中 a 是直线斜率,b 是直线截距。
看看下面的数据,它们是从斜率为 2、截距为 -5 的直线中抽取的散点:

rng = np.random.RandomState(1) 
x = 10 * rng.rand(50) 
y = 2 * x - 5 + rng.randn(50) 
plt.scatter(x, y);

可以用 Scikit-Learn 的 LinearRegression 评估器来拟合数据,并获得最佳拟合直线:

from sklearn.linear_model import LinearRegression 
model = LinearRegression(fit_intercept=True) 
model.fit(x[:, np.newaxis], y) 
xfit = np.linspace(0, 10, 1000) 
yfit = model.predict(xfit[:, np.newaxis]) 
plt.scatter(x, y) 
plt.plot(xfit, yfit);

数据的斜率和截距都在模型的拟合参数中,Scikit-Learn 通常会在参数后面加一条下划线,即 coef_ 和 intercept_:

print("Model slope: ", model.coef_[0]) 
print("Model intercept:", model.intercept_) 

输出结果如下所示:

Model slope: 2.02720881036 
Model intercept: -4.99857708555

可以看到,拟合结果与真实值非常接近,这正是我们想要的。
然而,LinearRegression 评估器能做的可远不止这些——除了简单的直线拟合,它还可以处理多维度的线性回归模型:
y = a 0 + a 1 x 1 + a 2 x 2 + … y = a_0 + a_1x_1 + a_2x_2 + … y=a0+a1x1+a2x2+
里面有多个 x 变量。从几何学的角度看,这个模型是拟合三维空间中的一个平面,或者是为更高维度的数据点拟合一个超平面。
虽然这类回归模型的多维特性使得它们很难可视化,但是我们可以用 NumPy 的矩阵乘法运算符创建一些数据,从而演示这类拟合过程:

rng = np.random.RandomState(1) 
X = 10 * rng.rand(100, 3) 
y = 0.5 + np.dot(X, [1.5, -2., 1.]) 
model.fit(X, y) 
print(model.intercept_) 
print(model.coef_) 

输出结果如下所示:

0.5 
[ 1.5 -2. 1.]

其中 y 变量是由 3 个随机的 x 变量线性组合而成,线性回归模型还原了方程的系数。
通过这种方式,就可以用一个 LinearRegression 评估器拟合数据的回归直线、平面和超平面了。虽然这种方法还是有局限性,因为它将变量限制在了线性关系上,但是不用担心,还有其他方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
线性回归机器学习中的一种基本算法,梯度下降法是线性回归中常用的优化算法。下面是线性回归梯度下降法的实现步骤: 1.读取数据集,包括自变量和因变量。 2.初始化相关参数,包括学习率、迭代次数、截距和斜率等。 3.定义计算代价函数,常用的代价函数是均方误差(MSE)。 4.梯度下降,通过不断迭代更新截距和斜率,使得代价函数最小化。 5.执行梯度下降算法,得到最优的截距和斜率。 下面是Python代码实现: ```python import numpy as np # 读取数据集 def load_data(file_path): data = np.loadtxt(file_path, delimiter=',') x_data = data[:, :-1] y_data = data[:, -1] return x_data, y_data # 初始化相关参数 def init_params(): b = 0 k = 0 learning_rate = 0.01 num_iterations = 1000 return b, k, learning_rate, num_iterations # 定义计算代价函数 def compute_cost(b, k, x_data, y_data): total_error = 0 for i in range(len(x_data)): total_error += (y_data[i] - (k * x_data[i] + b)) ** 2 cost = total_error / float(len(x_data)) return cost # 梯度下降 def gradient_descent(b, k, x_data, y_data, learning_rate, num_iterations): m = float(len(x_data)) for i in range(num_iterations): b_gradient = 0 k_gradient = 0 for j in range(len(x_data)): b_gradient += (1/m) * ((k * x_data[j] + b) - y_data[j]) k_gradient += (1/m) * ((k * x_data[j] + b) - y_data[j]) * x_data[j] b = b - (learning_rate * b_gradient) k = k - (learning_rate * k_gradient) return b, k # 执行梯度下降算法 def linear_regression(file_path): x_data, y_data = load_data(file_path) b, k, learning_rate, num_iterations = init_params() print("Starting parameters: b = {0}, k = {1}, cost = {2}".format(b, k, compute_cost(b, k, x_data, y_data))) b, k = gradient_descent(b, k, x_data, y_data, learning_rate, num_iterations) print("After {0} iterations: b = {1}, k = {2}, cost = {3}".format(num_iterations, b, k, compute_cost(b, k, x_data, y_data))) # 调用线性回归函数 linear_regression('data.csv') ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值