线性回归
机器学习主要分为有监督问题(有label标签)和无监督问题(无label标签)
回归和分类的区别在于:回归问题,最终的预测结果是具体数值,而非类别;分类问题,最终的预测结果属于类别1或者类别0。
简单线性回归:
(1)做决定的过程通常是根据两个或多个变量之间的关系
(2)回归分析用来建立方程模拟两个或多个变量之间如何关联
(3)简单线性回归包含一个自变量x和一个因变量y,两个变量的关系用一条直线模拟。
(4)若包含大于等于两个自变量,叫多元回归分析。
简单线性回归模型:
![]()
其中β0和β1是参数,需要求出来。
ε是偏差,且值是独立的,满足正态分布且均值等于0.
简单线性回归方程:
![]()
E(y)是y的期望值(均值)。
估计的简单线性回归方程:
![]()
其中,因变量是y的估计值,b0是β0的估计值,b1是β1的估计值.
| 广告数量x | 卖出的车y |
| 1 | 14 |
| 3 | 24 |
| 2 | 18 |
| 1 | 17 |
| 3 | 27 |
如何用样本求得线性回归方程
?
衡量模型的好坏是:
![]()
括号中前者为真实值,后者为估计值,所以需使上式值最小,求得:

![]()
我们用python求其线性回归方程,并预测假设有一周广告数量为6,预测的汽车销售量是多少?
# -*- encoding=utf-8 -*- #简单线性回归:只有一个自变量 y=k*x+b 预测使 (y-y*)^2 最小 import numpy as np def fitSLR(x,y): n=len(x) dinominator = 0 numerator=0 for i in range(0,n): numerator += (x[i]-np.mean(x))*(y[i]-np.mean(y)) dinominator += (x[i]-np.mean(x))**2 print("numerator:"+str(numerator)) print("dinominator:"+str(dinominator)) b1 = numerator/float(dinominator) b0 = np.mean(y)/float(np.mean(x)) return b0,b1 # y= b0+x*b1 def prefict(x,b0,b1): return b0+x*b1 x=[1,3,2,1,3] y=[14,24,18,17,27] b0,b1=fitSLR(x, y) print('b0='+str(b0)) print('b1='+str(b1)) y_predict = prefict(6,b0,b1) print("y_predict:"+str(y_predict))
求得:b0=10,b1=5,一周广告数量为6时,预测的汽车销售量是40
另一个例子:
| 工资 | 年龄 | 额度 |
| 4000 | 25 | 20000 |
| 8000 | 30 | 70000 |
| 5000 | 28 | 35000 |
| 7500 | 33 | 50000 |
| 12000 | 40 | 85000 |
工资和年龄是特征,我们定义工资为x1,年龄为x2。
目标是预测银行会贷款多少钱。表中的额度是标签。
工资和年龄都会影响最终银行贷款的结果,这个影响因子我们定义为θ1(工资对额度的影响),θ2(年龄对额度的影响),相当于权重。
针对这个例子,用线性回归进行解释:

X1,X2就是我们的两个特征(年龄,工资),Y是银行最终会借多少钱。
找到最合适的一条线(想象一个高维)来最好的拟合我们的数据点。
拟合的平面,其中θ0为偏置项:

hθ(x)是预测值,表示银行贷款的额度。
整合上式为:
![]()
真实值和预测值之间存在的误差用ε表示。
对于每个样本:
(1)
其中y(i)表示真实值,θTx(i)表示预测值,ε是误差。
误差ε(i)是独立且具有相同的分布,并且服从均值为0(μ=0)方差为θ2的高斯分布(就是正态分布)。
独立是说样本间(如张三和李四)是单独的,不会相互影响;同分布是说他俩都来的是该银行,符合这个模型。
因为误差服从高斯分布,所以:
(2)
将(1)带入(2):
![]()
θ是要找的参数,L(θ)是似然函数,m表示样本数:求其最大值

将似然函数L(θ)变成对数似然(因为乘法难解,加法比较容易,对数里面的乘法可以转化为加法):

展开化简:
(3)
目标函数:

其中y(i)是真实值,θTx(i)是预测值,就是要让其差值尽可能小,也就是目标函数求最小值。

简易线性回归代码实现:
import matplotlib.pyplot as plt import numpy as np from sklearn import datasets #sklearn是python的机器学习库,导入数据集 class LinearRegression(): def __init__(self): self.w = None def fit(self, X, y): X = np.insert(X, 0, 1, axis=1) #定义权重西塔0的x为1 print (X.shape) X_ = np.linalg.inv(X.T.dot(X)) self.w = X_.dot(X.T).dot(y) #权重西塔值,公式结果 def predict(self, X): # Insert constant ones for bias weights X = np.insert(X, 0, 1, axis=1) y_pred = X.dot(self.w) return y_pred def mean_squared_error(y_true, y_pred): mse = np.mean(np.power(y_true - y_pred, 2)) return mse def main(): # Load the diabetes dataset diabetes = datasets.load_diabetes() # Use only one feature X = diabetes.data[:, np.newaxis, 2] print (X.shape) # Split the data into training/testing sets x_train, x_test = X[:-20], X[-20:] # Split the targets into training/testing sets y_train, y_test = diabetes.target[:-20], diabetes.target[-20:] clf = LinearRegression() clf.fit(x_train, y_train) y_pred = clf.predict(x_test) # Print the mean squared error print ("Mean Squared Error:", mean_squared_error(y_test, y_pred)) # Plot the results plt.scatter(x_test[:,0], y_test, color='black') plt.plot(x_test[:,0], y_pred, color='blue', linewidth=3) plt.show() main()
运行结果:


浙公网安备 33010602011771号