Pythonプログラミング:勾配降下アルゴリズム多重線形回帰式を用いて、比較の精度で最小二乗法を解きます

3つの勾配降下アルゴリズム多重線形回帰方程式を解くために:

(1)のような質問を:

関連性の大店の面積を持つショップエリアの財の月次売上高を得るために、または駅から店舗大きな距離に関連付けられている、我々はエリア、駅からの距離だけでなく、毎月の売上高の確立を買い物をする必要があります線形回帰式や方程式、相関係数を解きます:

ここに画像を挿入説明

テーブル・データ入力Excelスプレッドシート、mytest.csvとしてファイルを保存します。

ここに画像を挿入説明

最初の列は、店舗エリア、第二カラムからの最寄り駅、売上高の3番目の列です。

(2)Pythonプログラミング:

1.完全なコード
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
data=np.genfromtxt('mytest.csv',delimiter=',')
x_data=data[:,:-1]
y_data=data[:,2]
#定义学习率、斜率、截据
#设方程为y=theta1x1+theta2x2+theta0
lr=0.00001
theta0=0
theta1=0
theta2=0
#定义最大迭代次数,因为梯度下降法是在不断迭代更新k与b
epochs=10000
#定义最小二乘法函数-损失函数(代价函数)
def compute_error(theta0,theta1,theta2,x_data,y_data):
    totalerror=0
    for i in range(0,len(x_data)):#定义一共有多少样本点
        totalerror=totalerror+(y_data[i]-(theta1*x_data[i,0]+theta2*x_data[i,1]+theta0))**2
    return totalerror/float(len(x_data))/2
#梯度下降算法求解参数
def gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs):
    m=len(x_data)
    for i in range(epochs):
        theta0_grad=0
        theta1_grad=0
        theta2_grad=0
        for j in range(0,m):
            theta0_grad-=(1/m)*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta2)+y_data[j])
            theta1_grad-=(1/m)*x_data[j,0]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])
            theta2_grad-=(1/m)*x_data[j,1]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])
        theta0=theta0-lr*theta0_grad
        theta1=theta1-lr*theta1_grad
        theta2=theta2-lr*theta2_grad
    return theta0,theta1,theta2
#进行迭代求解
theta0,theta1,theta2=gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs)
print('迭代次数:{0} 学习率:{1}\na0={2}\na1={3}\na2={4}'.format(epochs,lr,theta0,theta1,theta2))
print("多元线性回归方程为:y=",theta1,"X1+",theta2,"X2+",theta0)
#画图
ax=plt.figure().add_subplot(111,projection='3d')
ax.scatter(x_data[:,0],x_data[:,1],y_data,c='r',marker='o')
x0=x_data[:,0]
x1=x_data[:,1]
#生成网格矩阵
x0,x1=np.meshgrid(x0,x1)
z=theta0+theta1*x0+theta2*x1
#画3d图
ax.plot_surface(x0,x1,z)
ax.set_xlabel('area')
ax.set_ylabel('distance')
ax.set_zlabel("Monthly turnover")
plt.show()
2.ファイル名を指定して実行結果

[画像のチェーンは、失敗したダンプの外に、ソースステーションは、セキュリティチェーン機構を有していてもよい、それは直接ダウンアップロードした写真を保存することをお勧めします(IMG-j6GUOl0Y-1586159383034)(。\画像-20200406130245662.png)]

漫画式のコントラスト

[画像のチェーンは、失敗したダンプの外に、ソースステーションは、セキュリティチェーン機構を有していてもよい、それは直接ダウンアップロードした写真を保存することをお勧めします(IMG-KMfb5cAK-1586159383035)(。\画像-20200406131928497.png)]

検出されたエラー。

複数の線形回帰方程式を解くために最小二乗法を使用して第四に、:

(1)Pythonプログラミング

1.完全なコード
#利用线性代数的矩阵模拟最小二乘法求解法求解多元线性回归方程的系数
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
%matplotlib inline
data = np.genfromtxt("mytest.csv",delimiter=",")
X1=data[0:10,0]#自变量温度
X2=data[0:10,1]#因变量销售量
Y=data[0:10,2]#自变量温度
#将因变量赋值给矩阵Y1
Y1=np.array([Y]).T
#为自变量系数矩阵X赋值
X11=np.array([X1]).T
X22=np.array([X2]).T
A=np.array([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]])#创建系数矩阵
B=np.hstack((A,X11))#将矩阵a与矩阵X11合并为矩阵b
X=np.hstack((B,X22))#将矩阵b与矩阵X22合并为矩阵X
#求矩阵X的转置矩阵
X_=X.T
#求矩阵X与他的转置矩阵的X_的乘积
X_X=np.dot(X_,X)
#求矩阵X与他的转置矩阵的X_的乘积的逆矩阵
X_X_=np.linalg.inv(X_X)
#求解系数矩阵W,分别对应截距b、a1、和a2
W=np.dot(np.dot((X_X_),(X_)),Y1)
b=W[0][0]
a1=W[1][0]
a2=W[2][0]
print("系数a1=",a1)
print("系数a2=",a2)
print("截距为=",b)
print("多元线性回归方程为:y={0}*X1+{1}*X2+{2}".format(a1,a2,b))
#画出线性回归分析图
data1=pd.read_excel('mytest.xlsx')
sns.pairplot(data1, x_vars=['area','distance'], y_vars='sales', height=3, aspect=0.8, kind='reg')  
plt.show() 
#求月销售量Y的和以及平均值y1
sumy=0#因变量的和
y1=0#因变量的平均值
for i in range(0,len(Y)):
    sumy=sumy+Y[i]
y1=sumy/len(Y)
#求月销售额y-他的平均值的和
y_y1=0#y-y1的值的和
for i in range(0,len(Y)):
    y_y1=y_y1+(Y[i]-y1)
print("销售量-销售量平均值的和为:",y_y1)
#求预测值sales1
sales1=[]
for i in range(0,len(Y)):
    sales1.append(a1*X1[i]+a2*X2[i]+b)
#求预测值的平均值y2
y2=0
sumy2=0
for i in range(len(sales1)):
    sumy2=sumy2+sales1[i]
y2=sumy2/len(sales1)
#求预测值-平均值的和y11_y2
y11_y2=0
for i in range(0,len(sales1)):
   y11_y2=y11_y2+(sales1[i]-y2)
print("预测销售值-预测销售平均值的和为:",y11_y2)
#求月销售额y-他的平均值的平方和
Syy=0#y-y1的值的平方和
for i in range(0,len(Y)):
    Syy=Syy+((Y[i]-y1)*(Y[i]-y1))
print("Syy=",Syy)
#求y1-y1平均的平方和
Sy1y1=0
for i in range(0,len(sales1)):
    Sy1y1=Sy1y1+((sales1[i]-y2)*(sales1[i]-y2))
print("Sy1y1=",Sy1y1)
#(y1-y1平均)*(y-y平均)
Syy1=0
for i in range(0,len(sales1)):
    Syy1=Syy1+((Y[i]-y1)*(sales1[i]-y2))
print("Syy1=",Syy1)
#求R
R=Syy1/((Syy*Sy1y1)**0.5)
R2=R*R
print("判定系数R2=",R2)
2.ファイル名を指定して実行結果

[画像のチェーンは、失敗したダンプの外に、ソースステーションは、セキュリティチェーン機構を有していてもよい、それは直接ダウンアップロードした写真を保存することをお勧めします(IMG-VE3iKArE-1586159383035)(。\画像-20200406131416311.png)]

結果(2)比較最小二乗法と勾配降下アルゴリズム

比較3つの結果

勾配降下アルゴリズム:

[画像のチェーンは、失敗したダンプの外に、ソースステーションは、セキュリティチェーン機構を有していてもよい、それは直接ダウンアップロードした写真を保存することをお勧めします(IMG-WzRhvvNI-1586159383036)(。\画像-20200406132243921.png)]

最小二乗法:

[チェーン外画像ダンプが失敗し、発信局は、画像を保存することが推奨され、セキュリティチェーン機構を有していてもよい直接ダウン(IMG-ajqYOgDs-1586159383036)をアップロード(。\画像-20200406132319282.png)]

コミックの結果:

[画像のチェーンは、失敗したダンプの外に、ソースステーションは、セキュリティチェーン機構を有していてもよい、直接ダウンアップロードされた画像を保存することをお勧めします(IMG-NenDKsd0-1586159383036)(。\画像-20200406131928497.png)]

両方の結果を比較することにより、勾配降下アルゴリズムより、最小二乗法の進歩ことを見出しました。数回の反復の勾配降下が完了するが、進展は高くありませんが、それは基本的に方法ことを放棄し、より廃棄物、です。

V.の概要

比較すると、勾配降下法と最小二乗法、勾配降下法のステップサイズは選択するが、最小二乗法を必要としません。勾配降下反復解法は、分析溶液の最小二乗計算です。サンプルサイズが大きくなく、そしてそこ解析解場合、最小二乗法は、高速計算するために勾配降下法に比べて利点を有します。サンプルサイズは、最小二乗法により要求スーパー逆行列による大きい場合は、解析解を解決することが困難又は遅く、反復勾配降下法を使用することの利点を有します。

リリース元の2件の記事 ウォンの賞賛0 ビュー17

おすすめ

転載: blog.csdn.net/lk1252793766/article/details/105345235