目录
前言
线性回归理论推导
波士顿房价预测
matlab实现
python实现
前言
包含线性回归的梯度下降与正规方程的理论推导。
波士顿房价预测示例 matlaba版本 + juptype python版本
全部的内容如下:因为无法上传pdf,公式再打一遍太折磨了,直接上传了markdown里的内容,以及juptype转为了py导出的版本。复制粘贴可能部分换行符可能修改。
全部的代码、数据集、理论推导pdf文件:Regression.7z-机器学习文档类资源-CSDN文库
线性回归理论推导
为markdown格式的,在在线编辑器里面可以查看。或者下载文件里有导出的pdf版。
正规方程证明:
**回归与分类 *Regression/classification*** *-10-05*连续与离散## *Linear Regression*线性回归### 一次线性回归>一次线性代价函数关于两个自变量的图,3D曲面图,仅有全局最优解。对应一个特征,一次偏导计算很简单。***hypothesis function* 假设函数:**$${H}_{({θ}_{0},{θ}_{1})}({x}_{i})\, =\, {θ}_{0}+{θ}_{1}*{x}_{i} $$***cost function* 代价函数:**$${J}_{({x}_{i})}({θ}_{0},{θ}_{1})\, =\frac {1} {2m}\sum ^{m}_{i=1} {{[H}_{({θ}_{0},{θ}_{1})}}({x}_{i})\, -y({x}_{i}){]}^{2} $$**优化目标*minimisize***$$min({J}_{({θ}_{0},{θ}_{1})}({x}_{i})\, )\, \, \, for\, {θ}_{0}{,θ}_{1} $$***Batch gradient descent Model* 梯度下降**全览数据集$${θ}_{j}\, =\, {θ}_{j}\, -\, α\, *\, \frac {\partial (J({θ}_{0},{θ}_{1}))} {\partial {θ}_{j}}\, \, $$$$\frac {\partial (J({θ}_{0},{θ}_{1}))} {\partial {θ}_{j}}\, \, =\, \frac {1} {m}\sum ^{m}_{i=1} {[H({x}_{i})-y({x}_{i})]}\, *{x}_{i} $$>1、α为学习率,随着迭代进行,在靠近局部最优处,梯度(斜率)不断减小至0,因此不必要设置α减小。>>2、对每一个参数同时进行梯度下降,而不是更新完一个利用新参数更新下一个参数>>3、θ0 对应的 x 可以认为全1______### *Multiple features variables* 多特征1、*Gradient Descent* 梯度下降方法 类似一次回归模型。设m组数据(样本),n个特征,加上偏置,共需寻找n+1个最优参数(假设时候依然采用n,无影响)。同理可以设置偏置对应的数据为1。***hypothesis function* 假设函数:**$${H}_{({θ}_{1},{θ}_{2},\cdot \cdot \cdot {θ}_{n})}({X}_{i})\, =\, {θ}_{1}*{x}^{i}_{1}+\, {θ}_{2}*{x}^{i}_{2}+\cdot \cdot \cdot +{θ}_{n}*{x}^{i}_{n}\, (i=1,\cdot \cdot \cdot ,m) $$$$\frac {\partial (J({θ}_{1},\cdot \cdot \cdot ,{θ}_{n}))} {\partial {θ}_{j}}\, \, =\, \frac {1} {m}\sum ^{m}_{i=1} {[H({x}_{i})-y({x}_{i})]}\, *{x}^{i}_{j}\, (1\ll i\ll m,\, 1\ll j\ll n) $$矩阵运算有:$$H({x}_{i})\, =\, [{x}^{i}_{1},\, {x}^{i}_{2},\, \cdot \cdot \cdot ,{x}^{i}_{n}]\, {[{θ}_{1},{θ}_{2},\cdot \cdot \cdot ,{θ}_{n}]}^{T} $$$$X_{m\times n}=\begin{bmatrix}x_{11}& x_{12}& \cdots & x_{1j}&\cdots & x_{1n}\\x_{21}& x_{22}& \cdots & x_{2j}&\cdots & x_{2n}\\\vdots & \vdots & \cdots & \vdots&\cdots & \vdots \\x_{m1}& x_{m2}& \cdots & x_{mj}&\cdots & x_{mn}\end{bmatrix}=\left [ x_{ij}\right ]$$$$X_{j}{m\times 1}=\begin{bmatrix}x_{1j}\\x_{2j}\\\vdots\\x_{mj}\\\end{bmatrix}$$$$θ{n\times 1}=\begin{bmatrix}θ_{1}\\θ_{2}\\\vdots\\θ_{n}\\\end{bmatrix}$$$$H\, =\, X\, *\, θ$$$$\frac {\partial (J({θ}_{1},\cdot \cdot \cdot ,{θ}_{n}))} {\partial {θ}_{j}}\, \, =\, \frac {1} {m}\, *{[{X}_{j}]}^{T}*([H]-[Y])$$2、*Normal equation*正规方程 求最优θ值,除进行迭代外,可计算cost function关于每个θ的偏导,令偏导为0,求解。代价函数用矩阵形式变为:$$J(θ)\, =\, \frac {1} {2m}{(Xθ-Y)}^{T}(Xθ-Y)$$偏导为0计算得到的θ:$$θ\, =\, {({X}^{T}X)}^{-1}{X}^{T}Y $$$$证明如下:$$证明如下:$${J}_{({x}_{i})}({θ}_{1},{θ}_{2},\cdot \cdot \cdot ,{θ}_{n})\, =\frac {1} {2m}\sum ^{m}_{i=1} {[H}({x}^{i})\, -y({x}^{i}){]}^{2}$$$$\, =\frac {1} {2m}\sum ^{m}_{i=1} {[{X}^{i}}θ\, -{y}^{i}{]}^{2}$$$$\, =\frac {1} {2m}[{({X}^{1}θ-{y}^{1})}^{2}+{({X}^{2}θ-{y}^{2})}^{2}+\cdot \cdot \cdot +{({X}^{m}θ-{y}^{m})}^{2}]$$其中:$$\, =\frac {1} {2m}{Z}^{T}Z$$$${X}^{i}\, =\, [{x}^{i}_{1},\, {x}^{i}_{2},\cdot \cdot \cdot ,{x}^{i}_{n}]$$$$Z\, =\, {[({X}^{1}θ-{y}^{1}),\, ({X}^{2}θ-{y}^{2}),\cdot \cdot \cdot ,({X}^{m}θ-{y}^{m})]}^{T}$$$$Z =\begin{bmatrix}X^{1}θ-y^{1}\\X^{2}θ-y^{2}\\\vdots \\X^{m}θ-y^{m}\\\end{bmatrix}=\begin{bmatrix}X^{1}\\X^{2}\\\vdots \\X^{m}\\\end{bmatrix}*θ-\begin{bmatrix}y^{1}\\y^{2}\\\vdots \\y^{m}\\\end{bmatrix}=Xθ - Y$$得到: m个样本 n个特征$$X_{m\times n}=\begin{bmatrix}x^{1}_{1}& x^{1}_{2}& \cdots & x^{1}_{j}&\cdots & x^{1}_{n}\\x^{2}_{1}& x^{2}_{2}& \cdots & x^{2}_{j}&\cdots & x^{2}_{n}\\\vdots & \vdots & \cdots & \vdots&\cdots & \vdots \\x^{m}_{1}& x^{m}_{2}& \cdots & x^{m}_{j}&\cdots & x^{m}_{n}\\\end{bmatrix}$$矩阵形式的代价函数得到。如果明白矩阵求导的公式,可以直接求偏导得到θ当然也可以麻烦点算,如附图:------|梯度下降法| 正规方程 || :--------------------------: | :------------------------------: || 需要选择学习率 | 不需要 || 对于大量的特征值模型依然方便 | 大量特征值模型中求逆运算消耗量大 ||适用与各种类型模型| 仅用于线性,逻辑回归等不适用 |> 1、对于梯度下降法,学习率过大,有可能冲过最优值,导致代价函数随着迭代次数增大或者摇摆;而学习率过小则会使迭代过慢,当然,过大的学习率也可能导致迭代过慢。>> 2、梯度下降法,可以对数据先进行处理,使数据处于一个大致相同的范围,并不要求必须全在一个范围,只是大致相同即可。Feature Scaling。或者产生新特征,去除无用的特征。>> 3、Polynomial regression 多项式回归>> 4、利用 代价函数--迭代次数 图像判断学习率等参数、特征选取合理性。
波士顿房价预测
数据集https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.datahttps://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data
matlab实现
data = load("G:/AI/Regression/housing.txt");%%%13个特征 先画出每一个特征对结果的图像% MEDV: 自住房屋房价中位数(也就是均价)Title = ["CRIM: 城镇人均犯罪率""ZN: 住宅用地所占比例""INDUS: 城镇中非住宅用地所占比例""CHAS: 虚拟变量,用于回归分析""NOX: 环保指数""RM: 每栋住宅的房间数""AGE: 1940 年以前建成的自住单位的比例""DIS: 距离 5 个波士顿的就业中心的加权距离""RAD: 距离高速公路的便利指数""TAX: 每一万美元的不动产税率""PTRATIO: 城镇中的教师学生比例""B: 城镇中的黑人比例""LSTAT: 地区中有多少房东属于低收入人群""MEDV:中值"];% 求维度之间的相关系数rho = corr(data, 'type','pearson');%热力图figure(1) %热力图string_name={'CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','RTRATIO','B','LSTAT','MEDV'};xvalues = string_name;yvalues = string_name;h = heatmap(xvalues,yvalues,rho, 'FontSize',10, 'FontName','Times New Roman');h.Title = 'Correlation Coefficient';h.ColorbarVisible = 'on';h.ColorData = rho;map = [1 1 1; 1 1 0; 0.5 1 0.4; 0.2 0.85 0.2; 0.4 0.7 1; 0.2 0.5 0.8]; % 自己定义颜色colormap(map)%colormap(jet)figure(2)%各特征与数据结果对应图for i = 1:4for j = 1:4number = 4*(i-1)+j;if(number>13)break;endsubplot(4,4,number);scatter(data(:,number), data(:,14), 3);title(Title(number));endend%%%数据分割 特征值 与 结果X = [data(:,6), data(:,13)];Y = data(:,14);%数据归一化%X = (mapminmax(X'))';X = [ones(506,1),zscore(X)];%标准化%Y = (mapminmax(Y'))';[m,n] = size(X);%构建模型%1、Gradient_Descentfigure(2)%初始化 θ -1 - 1A = -1;B = 1;iterations = 50;theta = A + (B-A) * rand(n, 1); %训练的参数alpha = [0.001 0.003 0.007 0.01 0.05 0.1 0.2]; %学习率oldtheta = theta;J = zeros(1, iterations); %代价函数计算结果[~, alpha_numbers] = size(alpha);for a = 1:alpha_numbers %参数更新theta = oldtheta;for iter = 1:iterations%第i次迭代H = X * theta; %预测结果J(iter) = (H-Y)' * (H-Y) / 2 / m; %计算代价函数for j = 1:n theta(j) = theta(j) - alpha(a) * (X(:,j)'*(H - Y)) / n ;endend %画图空间[minJ, minIndex] = min(J);subplot(3,3,a);xlim([0 iterations]);scatter(1:iterations, J, 3);title("a="+num2str(alpha(a))+" Jmin="+num2str(minJ)+" Jiter="+num2str(minIndex));end% Normal_equation正规方程subplot(3,3,9)theta1 = (X'*X)^(-1) * X' * Y;H = X * theta1; %预测结果J = (H-Y)' * (H-Y) / 2 / m; %计算代价函数%画图空间xlim([0 iterations]);scatter(1, J, 3);title("Normal_equation"+" Jmin="+num2str(J));%预测结果 Z = [X*theta1,Y];figure(3)scatter(Y,X*theta1,3);hold onplot([min(Y),max(Y)],[min(Y),max(Y)],'g')
python实现
#!/usr/bin/env python# coding: utf-8# # 波士顿房价 线性预测模型# ZN超过25000平方英尺的住宅用地所占比例# # INDUS城镇非零售业务地区的比例# # CHAS查尔斯河虚拟变量(如果土地在河边=1;否则是0)# # NOX一氧化氮浓度(每1000万份)# # RM平均每居民房数# # AGE在1940年之前建成的所有者占用单位的比例# # DIS与五个波士顿就业中心的加权距离# # RAD辐射状公路的可达性指数# # TAX每10,000美元的全额物业税率# # RTRATIO城镇师生比例# # B1000(Bk-0.63)^2其中Bk是城镇黑人的比例# # LSTAT人口中地位较低人群的百分数# # MEDV(目标变量/类别属性)以1000美元计算的自有住房的中位数# # # 导入模块 数据的可视化分析# In[1]:import pandas as pdimport matplotlib.pyplot as pltimport mathimport seaborn as snsimport numpy as np# In[2]:colums = ['ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','RTRATIO','B','LSTAT','MEDV']df = pd.read_csv("G:/AI/Regression/housing.csv", names = colums, delimiter=r'\s+');df.shape# In[3]:#数据统计df.describe()# In[4]:#特征直方图 每一个特征的分类df.hist(figsize=(15,10))# In[5]:#可视化 显示每一个特征 与 结果之间的关系 cols = 3rows = math.ceil(12/cols)plt.figure(figsize=(10,10))for i in range(12):plt.subplot(rows, cols, i+1);plt.scatter(df[colums[i]], df[colums[12]])plt.title(colums[i])plt.tight_layout()#自适应#RM LSTAT特征线性关系明显# In[6]:#相关性 corr = df.corr().abs()corr# In[7]:#热力图plt.figure(figsize=(10,10))sns.heatmap(corr,annot=True)# # 构建模型 梯度下降 + 正规方程# In[8]:#RM LSTAT ->MEDVtheta = np.random.rand(3,) #向量print(theta.shape)#回归模型def H(x):return np.dot(theta,x.T)#评估函数def J(x, y):return np.sum((H(x)-y)**2) / len(y)theta# In[9]:#训练learning_rate = 0.001train_x = df[['RM', 'LSTAT']]train_x = (train_x - train_x.mean()) / train_x.std() #标准化train_x = np.insert(train_x.to_numpy(), 0, 1, axis = 1)train_y = df['MEDV'] #向量print(train_x.shape)print(train_y.shape)for i in range(50):theta = theta - learning_rate * np.dot(H(train_x) - train_y, train_x)metrics = J(train_x, train_y)print('第%d轮 均方误差%.04f theta%s' % (i+1, metrics, str(theta)))# In[10]:plt.figure(figsize = (20,5))plt.plot(np.arange(0,train_x.shape[0]),train_y, 'r--')plt.plot(np.arange(0,train_x.shape[0]),H(train_x), 'g-.')# In[11]:#正规方程theta = np.dot(np.dot(np.linalg.pinv(np.dot(train_x.T, train_x)), train_x.T),train_y)theta# In[ ]: