I‘m Linear Regression, One of the most important mathematical models and Mother of Models.
最小二乘法
在机器学习中,所有的算法模型其实都依赖于最小化或最大化某一个函数,我们称之为“目标函数”。
最小化的这组函数被称为“损失函数”。什么是损失函数呢?
损失函数描述了单个样本预测值和真实值之间误差的程度。用来度量模型一次预测的好坏。
损失函数是衡量预测模型预测期望结果表现的指标。损失函数越小,模型的鲁棒性越好。
找到a和b,使得损失函数:
尽可能最小。
将简单线性问题转为最优化问题。下面对函数的各个位置分量求导,导数为0的地方就是极值:
分别对a,b求导,最终我们通过最小二乘法得到a、b的表达式:
线性回归
定义:给定数据集D={(x1, y1), (x2, y2), ... },我们试图从此数据集中学习得到一个线性模型,这个模型尽可能准确地反应x(i)和y(i)的对应关系。这里的线性模型,就是属性(x)的线性组合的函数,可表示为:
向量表示为:
其中,w=(w1; w2;w3; ..., wd) 表示列向量
这里w表示weight,权重的意思,表示对应的属性在预测结果的权重,这个很好理解,权重越大,对于结果的影响越大;更一般化的表示是theta,是线性模型的参数,用于计算结果。
那么通常的线性回归,就变成了如何求得变量参数的问题,根据求得的参数,我们可以对新的输入来计算预测的值。(也可以用于对训练数据计算模型的准确度)
通俗的理解:x(i)就是一个个属性,theta(或者w/b),就是对应属性的参数(或者权重),我们根据已有数据集来求得属性的参数(相当于求得函数的参数),然后根据模型来对于新的输入或者旧的输入来进行预测(或者评估)。
import numpy as np
import random
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
def linear_regression_demo(n = 25):
#模拟一个 y = k * x 的数据集,并做一个线性回归,求解k,并做预测
#首先随机构造一个近似于y = k * x + b 的数据集
k = random.random()
b = random.random() * 1
x = np.linspace(0,n,n)
y = [ item * k +(random.random() - 0.5) * k * 5 + b for item in x]
true_y = [ item * k for item in x]
#进行一元线性回归
model = LinearRegression()
model.fit(np.reshape(x,[len(x),1]), np.reshape(y,[len(y),1]))
yy = model.predict(np.reshape(x,[len(x),1]))
#绘图
plt.figure()
kk = model.coef_[0][0] # 获得预测模型的参数
bb = model.intercept_[0] #获得预测模型的截距
plt.title('MebiuW\'s Scikit-Learn Notes : Linear Regression Demo \n True: y='+str(k)[0:4]+'x +'+str(b)[0:4]+' Predicted:y='+str(kk)[0:4]+'x +'+str(bb)[0:4] );
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True) # 显示网格
plt.plot(x,y,'r.') # 绘图
plt.plot(x,yy,'g-') # 绘图
plt.show() # 显示图像
linear_regression_demo()
线性回归鉴于其简单易用,易理解(注意上面提到的权重的理解),所以得到了很广泛的应用,在某些场景下或许有优于其它复杂方法的表现。
网友评论