机器学习|机器学习:1、线性回归--波士顿房价预测

目录
前言
线性回归理论推导
波士顿房价预测
matlab2021实现
python实现
前言 包含线性回归的梯度下降与正规方程的理论推导。
波士顿房价预测示例 matlab2021a版本 + juptypepython版本
全部的内容如下:因为无法上传pdf,公式再打一遍太折磨了,直接上传了markdown里的内容,以及juptype转为了py导出的版本。复制粘贴可能部分换行符可能修改。
全部的代码、数据集、理论推导pdf文件:Regression.7z-机器学习文档类资源-CSDN文库
线性回归理论推导 为markdown格式的,在在线编辑器里面可以查看。或者下载文件里有导出的pdf版。
正规方程证明:机器学习|机器学习:1、线性回归--波士顿房价预测
文章图片
???????

**回归与分类 *Regression/classification****2021-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.data机器学习|机器学习:1、线性回归--波士顿房价预测
文章图片
https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data
matlab2021实现
data = https://www.it610.com/article/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 = https://www.it610.com/article/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:4 for j = 1:4 number = 4*(i-1)+j; if(number>13) break; end subplot(4,4,number); scatter(data(:,number), data(:,14), 3); title(Title(number)); end end%% %数据分割 特征值 与 结果 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_Descent figure(2) %初始化 θ -1 - 1 A = -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 ; end end %画图空间 [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 on plot([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 城镇师生比例 # # B 1000(Bk-0.63)^2其中Bk是城镇黑人的比例 # # LSTAT 人口中地位较低人群的百分数 # # MEDV (目标变量/类别属性)以1000美元计算的自有住房的中位数 # # # 导入模块数据的可视化分析# In[1]:import pandas as pd import matplotlib.pyplot as plt import math import seaborn as sns import 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 = 3 rows = 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 ->MEDV theta = 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[ ]:

【机器学习|机器学习:1、线性回归--波士顿房价预测】

    推荐阅读