In [1]:
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
from numpy.linalg import inv, qr, svd, solve, lstsq
import seaborn as sns
%matplotlib inline
In [2]:
df = pd.read_csv('data.csv')
In [3]:
df.head()
Out[3]:
In [4]:
df.describe()
Out[4]:
In [5]:
df['x4'] = 1
In [6]:
X = df.iloc[:,(0,1,2,4)].values
In [7]:
y = df.y.values
$y = Xw$
$ w = (X^T*X)^[-1]*X^T*y$
In [8]:
inv_XX_T = inv(X.T.dot(X))
In [9]:
w = inv_XX_T.dot(X.T).dot(df.y.values)
In [10]:
w
Out[10]:
In [11]:
qr(inv_XX_T)
Out[11]:
In [12]:
X.shape
Out[12]:
In [312]:
#solve(X,y)##只能解方阵
In [118]:
def f(w,X,y):
return ((X.dot(w)-y)**2/(2*1000)).sum()
In [119]:
def grad_f(w,X,y):
return (X.dot(w) - y).dot(X)/1000
In [120]:
w0 = np.array([100.0,100.0,100.0,100.0])
In [121]:
epsilon = 1e-10
In [122]:
alpha = 0.1
In [123]:
check_condition = 1
In [243]:
while check_condition > epsilon:
w0 += -alpha*grad_f(w0,X,y)
check_condition = abs(grad_f(w0,X,y)).sum()
print w0
In [411]:
def cost_function(w,X,y):
return (X.dot(w)-y)**2/2
In [412]:
def grad_cost_f(w,X,y):
return (np.dot(X, w) - y)*X
In [462]:
w0 = np.array([1.0, 1.0, 1.0, 1.0])
In [477]:
epsilon = 1e-3
In [478]:
alpha = 0.01
In [479]:
# 生成随机index,用来随机索引数据.
random_index = np.arange(1000)
np.random.shuffle(random_index)
In [480]:
cost_value = np.inf #初始化目标函数值
In [481]:
while abs(grad_f(w0,X,y)).sum() > epsilon:
for i in range(1000):
w0 += -alpha*grad_cost_f(w0,X[random_index[i]],y[random_index[i]])
#检查目标函数变化趋势, 如果趋势变化达到临界值, 更新更小的步长继续计算
difference = cost_value - f(w0, X, y)
if difference < 1e-10:
alpha *= 0.9
cost_value = f(w0, X, y)
print w0
In [ ]: