机器学习之——线性回归(监督学习)

  本人计算机小白一枚,刚开始接触机器学习,下面是一篇关于机器学习线性回归的文章,参考各种资料写出来的,不喜勿喷,如有错误地方,还望指出,谢谢。

机器学习算法有很多,根据学习形式可以分为三大类:一是监督学习;二是无监督学习;三是半监督学习。

1. 监督学习:指对数据的若干特征与若干标签(类型)之间的关联性进行建模的过程。它的训练集数据中包含了类别信息(数据已经含有了标签),在学习时知道其分类结果。可以训练带标签的数据以预测新数据标签的模型。
监督学习算法包括:回归和分类。回归算法中的标签是连续的值,可以预测连续值的模型;而分类的算法中的标签是离散的值,可以预测两个或多个离散分类标签的模型
监督学习算法:线性回归、逻辑回归、K-近邻算法(KNN)、BP神经网络、朴素贝叶斯算法、随机森林、决策树、支持向量机

2. 无监督学习:对不带任何标签的数据特征进行建模。它的训练集数据中没有类别信息(数据没有标签),在学习时并不知道分类结果。可以识别无标签数据结构的模型。
无监督学习算法包括:聚类和降维。聚类是检测、识别数据显著组别的模型;降维是从高维数据中检测、识别低维数据结构模型无监督学习算法:(K-均值)K-means、主成分分析(PAC)、自编码器(Auto-Encoder)、最大期望(EM)算法、高斯混合模型、Apriori算法、谱聚类。

3. 半监督学习: 介于监督学习和无监督学习之间,通常可以在数据标签不完整下使用。

  三者最本质的区别是:在这三种学习形式当中,根据其训练集来判别是哪种类型,训练集 含有输入变量( x x x)和输出变量( y y y) 则为监督学习; 训练集只含有输入变量( x x x) 则为无监督学习;训练集 有一部分为输入变量有对应的输出变量( y y y),另一部分则没有输出变量( y y y) 则为半监督学习。

接下来开始介绍第一个最简单的机器学习算法——线性回归

一、单变量线性回归

1.模型介绍

  单变量线性回归模型中,含有两个变量,其中一个为输入变量(也即特征),另一个为输出变量(也即目标)。
  单变量线性回归其实就是通过这两个变量,找到它们之间的关系,然后用一条线性的直线将其关系进行表示出来的一个过程。比如下面的例子,可以利用线性回归找到一条拟合直线来描述他们之前的关系。这样一来就可以通过该拟合直线来预测我们想要的数据。

2.模型建立

  因此我们对上述数据进行建模,从数据可视化的图中可以看出,满足线性回归模型,线性回归模型的函数一般写为:

(1) h θ ( x ) = θ 0 + θ 1 x \color{red} h_{\theta}(x)={{ \theta }_{0}}+{{\theta }_{1}}{{x}}\tag{1} hθ(x)=θ0+θ1x(1)
其中 θ 0 {{ \theta }_{0}} θ0 θ 1 {{ \theta }_{1}} θ1为拟合参数, x x x为特征(输入变量), h θ ( x ) h_{\theta}(x) hθ(x)为模型输出值(预测值)。因为只有一个特征,所以为单变量线性回归。

3.模型损失

  当然在使用上述线性回归模型时,难免会存在一定的误差(模型所预测的值与训练中实际值之间的差距),产生的这个误差我们把它叫做建模误差。于是我们想把该误差(损失)消除或者使其最小,从而就能得到最佳的模型参数( θ 0 {{ \theta }_{0}} θ0 θ 1 {{ \theta }_{1}} θ1),这是就产生了代价函数(也叫损失函数,成本函数等)。
(2) J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 \color{red}J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( {{h}_{\theta }}\left( {{x}^{(i)}} \right)-{{y}^{(i)}} \right)}^{2}}}\tag{2} J(θ)=2m1i=1m(hθ(x(i))y(i))2(2)
  其中 m m m : 样本数量;
   x ( i ) {{x}^{(i)}} x(i):代表第 i i i个数据;
   y ( i ) {{y}^{(i)}} y(i):代表第 i i i个数据的预测值;
得到的代价函数 J ( θ ) J(\theta) J(θ)是一个关于参数 θ \theta θ的函数,接下来通过梯度下降法来求使代价值最小的参数 θ \theta θ

(ps:这里构造的平方的代价函数是为了方便进行梯度下降算法)

计算代价函数的Python代码如下:

## 代价函数:J(theta)
def computeCost(X, y, theta):    
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))

4.模型参数求解

  接下来对模型进行求解参数,我们需要用到一个 α \alpha α(学习率)来计算并更新每次迭代( i t e r s iters iters)的参数 θ \theta θ参数。

(3) θ j : = θ j − α ∂ ∂ θ j J ( θ ) \color{red}{{\theta }_{j}}:={{\theta }_{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( \theta \right)\tag{3} θj:=θjαθjJ(θ)(3)
此时得到的 ∂ ∂ θ j J ( θ ) \frac{\partial }{\partial {{\theta }_{j}}}J\left( \theta \right) θjJ(θ)的表达式中只含有 θ \theta θ,并且要同时更新 θ \theta θ
α \alpha α(学习率)决定了我们沿着能让代价函数下降程度最大方向向下迈出的步子有多大; i t e r s i t e r s itersiters itersiters(迭代次数),直到代价函数 J ( θ ) J(\theta) J(θ)收敛为止,即可求出我们想要的参数。

计算梯度下降的代码如下:

def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1])
    cost = np.zeros(iters)
    
    for i in range(iters):
        error = (X * theta.T) - y
        
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
            
        theta = temp
        cost[i] = computeCost(X, y, theta)
        
    return theta, cost

5.模型优缺点

优点:1)建模速度快,不需要复杂的计算,在数据量大的时候依然运行速度快;
    2)可以根据系数给出每个变量的理解和解释。
缺点:对异常值很敏感。

6.代码实现

1)使用常规法实现 ( n u m p y 和 p a n d a s \color{blue}numpy和pandas numpypandas):

import seaborn as sns;sns.set()
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data = pd.read_csv('ex1.csv', names=['a', 'b'])
x = np.asarray(data.get('a')).reshape(-1, 1)
y = data.get('b')

def computeCost(x, y, theta):
    inner = np.power(((x*theta.T)-y), 2)
    return np.sum(inner)/(2*len(x))

ones = pd.DataFrame({'ones': np.ones(len(data))})
data = pd.concat([ones, data], axis=1)

x = data.get(['ones', 'a'])
y = data.get(['b'])
x = np.matrix(x)
y = np.matrix(y)

theta = np.matrix(np.array([0, 0]))
J_0 = computeCost(x, y, theta)

# 编写梯度下降算法
def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1])
    cost = np.zeros(iters)

    for i in range(iters):
        error = (X * theta.T) - y

        for j in range(parameters):
            term = np.multiply(error, X[:, j])
            temp[0, j] = theta[0, j] - ((alpha / len(X)) * np.sum(term))

        theta = temp
        cost[i] = computeCost(X, y, theta)

    return theta, cost
    
alpha = 0.01
iters = 1000

g, cost = gradientDescent(x, y, theta, alpha, iters)
J = computeCost(x, y, g)

f = g[0, 0] + (g[0, 1] * x[:, 1])

plt.figure(figsize=(10, 7))
plt.plot(np.asarray(x)[:, 1], f, 'r', label='PredictedResult')
plt.scatter(data.a, data.b, label='Traning Data')
plt.xlabel('a')
plt.ylabel('b')
plt.title('a vs. b')
plt.legend()   
plt.show()

plt.figure(figsize=(10, 7))
plt.plot(np.arange(iters), cost, 'r')
plt.xlabel('Iterations')
plt.ylabel('Cost')
plt.title("Error")
plt.show()

print("第一次的代价函数的值:%f" % J_0)
print("收敛时的代价函数的值:%f" % J)
print("theta_0= %f" % g[0, 0])
print("theta_1= %f" % g[0, 1])

运行结果如下:

2)用 s k l e a r n \color{blue}sklearn sklearn

from sklearn import linear_model
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold, cross_val_score
import seaborn as sns;sns.set()
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data = pd.read_csv('ex1.csv', names=['a', 'b'])
x = np.asarray(data.get('a')).reshape(-1, 1)
y = data.get('b')

## 将数据集分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)

clf = linear_model.LinearRegression(normalize=True)
clf.fit(x_train, y_train)

theta_1,  theta_0= clf.coef_, clf.intercept_  ## 拟合参数

## 可视化结果
plt.figure(figsize=(10, 7))
plt.scatter(x_train, y_train, color='blue', label='TraningSet')
plt.plot(x_train, clf.predict(x_train), color='red', label='TraningResult')

plt.scatter(x_test, y_test, color='green', label='TestSet')
plt.plot(x_test, clf.predict(x_test), color='yellow', label='TestResult')
plt.xlabel('a_x')
plt.ylabel('b_y')
plt.title('a_x vs. b_y')
plt.legend()
plt.show()
print("theta_1= %f" % theta_1)
print("theta_0= %f" % theta_0)
clf.score(x_test, y_test)  ## 预测模型的好坏,分越高,效果更好,1.0为最佳

运行结果如下:

从可视化结果可以看出,红色直线为训练的结果,黄色直线为测试的结果,两者相互重合,说明该模型的准确率还是很高的;通过测试集的分数(97.35%)也可以看出,效果很不错。

二、多变量线性回归

  在线性回归当中,有的时候不止是一个自变量(输入变量),可能出现多个输入变量,比如房屋的价格( P r i c e Price Price)是由房屋的面积( A r e a Area Area)和房屋的数量( R o o m N u m RoomNum RoomNum)所决定的。此时特征就由一个变成了多个( x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3, …),此时的对数据的处理和单变量线性回归是一样的,只不过多个特征,将其数据可视化要在多维空间里实现,两个特征的话,可以在三维空间实现可视化,但是二维以上的特征,就难以实现,只能得到拟合参数和代价函数。不过在多变量线性回归里面,我们可能会多加一个预处理的步骤——特征归一化
  归一化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内,是为了后面数据处理的方便,也可以消除特征之间量级不同导致的影响,其次是保正程序运行时收敛加快。对于分类问题来说,一般是需要进行归一化处理,因为分类问题关心变量的值;而对于概论型问题,则不需要进行归一化处理,因为它并不关心变量的值,而关心变量的分布和变量之间的条件概率。

  在多变量线性回归当中,模型函数中的特征变多了,于是变成了下面的式子:
(4) J ( θ ) = 1 2 m ∑ j = 0 n ∑ i = 1 m ( h θ ( x j ( i ) ) − y j ( i ) ) 2 \color{red}J\left( \theta \right)=\frac{1}{2m}\sum\limits_{j=0}^{n}\sum\limits_{i=1}^{m}{{{\left( {{h}_{\theta }}\left( {{x_j}^{(i)}} \right)-{{y_j}^{(i)}} \right)}^{2}}}\tag{4} J(θ)=2m1j=0ni=1m(hθ(xj(i))yj(i))2(4)
其中:
(5) h θ ( x j ) = ∑ j = 0 n θ j x j = θ T X = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n \color{red}h_{\theta}(x_j)=\sum\limits_{j=0}^{n}{\theta}_{j}{x_j}={{\theta }^{T}}X={{\theta }_{0}}{{x}_{0}}+{{\theta }_{1}}{{x}_{1}}+{{\theta }_{2}}{{x}_{2}}+...+{{\theta }_{n}}{{x}_{n}}\tag{5} hθ(xj)=j=0nθjxj=θTX=θ0x0+θ1x1+θ2x2+...+θnxn(5)

m m m:样本的数量
n n n:特征的数量(输出变量的数量)
θ j {\theta_j} θj:拟合参数

                  X = [ x 1 x 2 x 3 . . . x n ] X=\begin{bmatrix}{x_1}\\{x_2}\\{x_3}\\.\\.\\.\\{x_n}\end{bmatrix} X=x1x2x3...xn         θ = [ θ 1 θ 2 θ 3 . . . θ n ] {\theta}=\begin{bmatrix}{\theta_1}\\{\theta_2}\\{\theta_3}\\.\\.\\.\\{\theta_n}\end{bmatrix} θ=θ1θ2θ3...θn

梯度下降更新拟合参数:
(6) θ j : = θ j − α ∂ ∂ θ j J ( θ ) \color{red}{{\theta }_{j}}:={{\theta }_{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( \theta \right)\tag{6} θj:=θjαθjJ(θ)(6)

代码如下:
1)用常规方法:

import seaborn as sns;sns.set()
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 编写代价函数
def computeCost(x, y, theta):
    inner = np.power(((x*theta.T)-y), 2)
    return np.sum(inner)/(2*len(x))

# 编写梯度下降算法
def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1])
    cost = np.zeros(iters)

    for i in range(iters):
        error = (X * theta.T) - y

        for j in range(parameters):
            term = np.multiply(error, X[:, j])
            temp[0, j] = theta[0, j] - ((alpha / len(X)) * np.sum(term))

        theta = temp
        cost[i] = computeCost(X, y, theta)

    return theta, cost

data = pd.read_csv('ex2.csv', header=None, names=['Area', 'RoomNum', 'Price'])
data = (data - data.mean()) / data.std()

## 对数据进行归一化处理,并添加一行
data1 = (data-data.mean())/data.std()
ones = pd.DataFrame({'one': np.ones(len(data1))})
data1 = pd.concat([ones, data1], axis=1)

X = data1.get(['one', 'Area', 'RoomNum'])
x = np.matrix(X)
Y = data1.get(['Price'])
y = np.matrix(Y)

# 初始化变量---学习率α和迭代次数
alpha = 0.01
iters = 1000

theta1 = np.matrix(np.array([0, 0, 0]))
J_0 = computeCost(x, y, theta1)

## 计算梯度下降
g, cost1 = gradientDescent(x, y, theta1, alpha, iters)
# print(cost1)
J = computeCost(x, y, g)

## 把得到的参数取出来,要变成nparray数组,因为在计算预测值f时,算的是数量积

##  matrix的 *  为向量积,
##  array的  *  为数量积

X1, X2 = np.meshgrid(np.asarray(X)[:, 1], np.asarray(X)[:, 2])
# a, b, c = np.asarray(g)[:, 0], np.meshgrid(g)[:, 1], np.asarray(g)[:, 2]
a = np.asarray(g)[:, 0]
b = np.asarray(g)[:, 1]
c = np.asarray(g)[:, 2]

f =np.asarray(a + b*X1 + c*X2)

## 3D散点图
fig = plt.figure()
axes3d = Axes3D(fig)
## 使用plt.scatter()画散点图时,xy直接为DataFrame的每一列
axes3d.scatter(np.asarray(X)[:, 1], np.asarray(X)[:, 2], y, c='b', marker='o')  
###  使用plt.plot_surface()函数画图时,需要注意的是,里面的xyz三个坐标为meshgrid(nparrary)的网格点
axes3d.plot_surface(X1, X2, f, shade=False, color='red')  
axes3d.set_xlabel('Area')
axes3d.set_ylabel('RoomNum')
axes3d.set_zlabel('Price')
axes3d.set_title('PredictedResult')

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost1, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

运行结果如下:

2)用 s k l e a r n sklearn sklearn

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import linear_model
from sklearn.model_selection import train_test_split
import time

data = pd.read_csv('ex2.csv', names=['Area', 'RoomNum', 'Price'])
x = data.get(['Area', 'RoomNum'])
y = data.get('Price')
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)

reg = linear_model.LinearRegression()
reg.fit(x_train, y_train)


x0_train, x1_train = np.meshgrid(np.asarray(x_train)[:, 0], np.asarray(x_train)[:, 1])
y_train_pred = np.array(reg.coef_[0]*x0_train + reg.coef_[1]*x1_train + reg.intercept_)
x0_test, x1_test = np.meshgrid(np.asarray(x_test)[:, 0], np.asarray(x_test)[:, 1])
y_test_pred = np.array(reg.coef_[0]*x0_test + reg.coef_[1]*x1_test + reg.intercept_)

acc_test = reg.score(x_test, y_test)
acc_train = reg.score(x_train, y_train)

fig = plt.figure()
ax3d = Axes3D(fig)
ax3d.scatter(np.asarray(x_train)[:, 0], np.asarray(x_train)[:, 1], np.asarray(y_train), alpha=0.8, color='blue')
ax3d.scatter(np.asarray(x_test)[:, 0], np.asarray(x_test)[:, 1], np.asarray(y_test), alpha=0.8, color='green')
ax3d.plot_surface(x0_train, x1_train, y_train_pred, shade=False, color='red')
ax3d.plot_surface(x0_test, x1_test, y_test_pred, shade=False, color='yellow')
ax3d.set_xlabel('area')
ax3d.set_ylabel('room_num')
ax3d.set_zlabel('price')
ax3d.set_title('PredictedResult')
plt.show()

print(acc_train)
print(acc_test)

运行结果如下:

从可视化结果可以看出,红色平面为训练的结果,黄色平面为测试的结果,两者几乎相互重合,说明该模型的准确率还是很高的;测试集和训练集的分数不是很好,两者还是有一点差距,效果不是很好。

三、正规方程

  对于线性回归来说,大部分使用的是梯度下降算法,但是对于某些问题来说,正规方程也是一种很好的解决办法。
我们假设我们预测得到的结果为 y y y,那么有如下的式子( J ( θ ) J({\theta}) J(θ)的 公式为(4), h θ ( x ) h_{\theta}(x) hθ(x)的公式为(5)):
(7) y = θ T X \color{red}y={\theta}^TX\tag{7} y=θTX(7)
J ( θ ) J({\theta}) J(θ)求偏导,然后令偏导等于零:
(8) ∂ ∂ θ j J ( θ ) = 0 \color{red}\frac{\partial }{\partial {{\theta }_{j}}}J\left( \theta \right)=0\tag{8} θjJ(θ)=0(8)
来求解最小的参数 θ {\theta} θ,最后通过解方程得到:
(9) θ = ( X T X ) − 1 X T y \color{red}{\theta}=(X^TX)^{-1}X^Ty\tag{9} θ=(XTX)1XTy(9)

我们得知道对矩阵求偏导的法则(可以参考下面的文章):
https://blog.csdn.net/daaikuaichuan/article/details/80620518
在这里我们要用到其中的两个公式:

(10) ∂ A u ( x ) ∂ x = A T \color{red}\frac{\partial{A u(x)}}{\partial x}=A^T\tag{10} xAu(x)=AT(10)
(11) ∂ x T A x ∂ x = 2 A x \color{red}\frac{\partial{x^TAx}}{\partial x}=2Ax\tag{11} xxTAx=2Ax(11)

计算结果如下:
将所有的变量都由向量表示,于是就有( X X X ( m ∗ n ) (m*n) (mn)的矩阵, θ {\theta} θ ( n ∗ 1 ) (n*1) (n1)d的矩阵, y y y ( m ∗ 1 ) (m*1) (m1)的矩阵):
(12) J ( θ ) = 1 2 ( X θ − y ) 2 \color{red}J({\theta})=\frac{1}{2} (X{\theta}-y)^2\tag{12} J(θ)=21(Xθy)2(12)
(13) J ( θ ) = 1 2 ( X θ − y ) T ( X θ − y ) = 1 2 ( X T θ T − y T ) ( X θ − y ) \color{red}J({\theta})=\frac{1}{2} (X{\theta}-y)^T(X{\theta}-y)=\frac{1}{2} (X^T{\theta}^T-y^T)(X{\theta}-y)\tag{13} J(θ)=21(Xθy)T(Xθy)=21(XTθTyT)(Xθy)(13)
(14) J ( θ ) = 1 2 ( θ T X T X θ − θ T X T y − y T X θ + y T y ) \color{red}J({\theta})=\frac{1}{2}({\theta}^{T}{X}^TX{\theta}-{\theta}^TX^Ty-y^TX{\theta}+y^Ty)\tag{14} J(θ)=21(θTXTXθθTXTyyTXθ+yTy)(14)
(15) ∂ J θ ∂ θ = 1 2 ( 2 X T X θ − X T y − ( y T X ) T + 0 ) \color{red}\frac{\partial{J{\theta}}}{\partial{\theta}} = \frac{1}{2}(2X^TX{\theta}-X^Ty-(y^TX)^T+0)\tag{15} θJθ=21(2XTXθXTy(yTX)T+0)(15)
(16) ∂ J θ ∂ θ = 1 2 ( 2 X T X θ − X T y − X T y ) = X T X θ − X T y \color{red}\frac{\partial{J{\theta}}}{\partial{\theta}}=\frac{1}{2}(2X^TX{\theta}-X^Ty-X^Ty)=X^TX{\theta}-X^Ty\tag{16} θJθ=21(2XTXθXTyXTy)=XTXθXTy(16)

(17) ∂ J ( θ ) ∂ θ = 0 \color{red}\frac{\partial{J({\theta})}}{\partial {{\theta }}}=0\tag{17} θJ(θ)=0(17)
则有:
(18) θ = ( X T X ) − 1 X T y \color{red}{\theta}=(X^TX)^{-1}X^Ty\tag{18} θ=(XTX)1XTy(18)

代码:

import seaborn as sns;sns.set()
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data = pd.read_csv('ex1.csv', names=['a', 'b'])
ones = pd.DataFrame({'ones': np.ones(len(data))})
data = pd.concat([ones, data], axis=1)

x = data.get(['ones', 'a'])
y = data.get(['b'])
x = np.matrix(x)
y = np.matrix(y)

# 正规方程求解
def normalEqn(X, y):
    theta = np.linalg.inv(X.T@X)@X.T@y   #X.T@X等价于X.T.dot(X)
    return theta

theta=normalEqn(x[:, :2], y)

x1 = np.asarray(x[:,1])
y = np.asarray(y)
theta_0 = np.asarray(theta)[0]
theta_1 = np.asarray(theta)[1]
f = theta_0 + theta_1*x1

plt.figure(figsize=(10, 7))
plt.scatter(x1, y, label="TrainingData")
plt.plot(x1, f, 'r', label="Pricted")
plt.xlabel('a')
plt.ylabel('b')
plt.title('a vs. b')
plt.legend()  
plt.show()

运行结果:

从可视化的结果来看,正规方程也能够很好的描述线性回归模型,所有的点就均匀分布在线性方程的两侧;计算出来的参数 θ 0 {\theta_0} θ0 θ 1 {\theta_1} θ1与梯度下降得到的还是有一点差距的。

下面借用吴恩达的总结:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习中,线性回归是一种常见的实战方法。线性回归的目标是通过拟合一个线性模型来预测一个连续的目标变量。在实际应用中,线性回归可以用于预测房价、销售量等连续变量。 线性回归的基本定义是通过最小化预测值与真实值之间的平方误差来拟合一个线性模型。这可以通过梯度下降算法来实现。梯度下降算法是一种迭代优化算法,通过不断调整模型参数来最小化损失函数。 在线性回归中,我们可以使用最小二乘法来计算模型参数。最小二乘法通过求解正规方程来得到模型参数的闭式解。然而,当矩阵为非满秩矩阵时,无法求逆,这时可以采用岭回归来解决这个问题。岭回归通过在矩阵的转置乘以矩阵上加上一个正则化项来使矩阵非奇异,从而能够求逆。 另一种方法是使用梯度下降算法来求解线性回归模型的参数。梯度下降算法通过不断迭代调整模型参数来最小化损失函数。在每一次迭代中,算法根据损失函数的梯度方向更新模型参数。通过不断迭代,梯度下降算法可以逐渐接近最优解。 在实际应用中,线性回归可以通过使用不同的特征工程方法来提高模型的性能。特征工程包括选择合适的特征、处理缺失值、进行特征缩放等。此外,线性回归还可以通过引入正则化项来防止过拟合问题。 总结起来,机器学习中的线性回归是一种常见的实战方法,可以通过最小化预测值与真实值之间的平方误差来拟合一个线性模型。可以使用最小二乘法或梯度下降算法来求解模型参数。在实际应用中,还可以通过特征工程和正则化来提高模型性能。 #### 引用[.reference_title] - *1* [机器学习实战(一)—— 线性回归](https://blog.csdn.net/qq_44715621/article/details/110449232)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [机器学习实战----线性回归](https://blog.csdn.net/zhangyingjie09/article/details/83018072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [机器学习实战之线性回归](https://blog.csdn.net/luoluopan/article/details/88052806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值