特征归一化后的多项式回归拟合结果

  统计/机器学习 回归分析 数据预处理    浏览次数:91        分享
0


#%%
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ITEMS = 4
path = 'train.txt'
data = pd.read_csv(path, sep='\t\t', header=None, names=['Population', 'Profit'],)
base = data.iloc[:, 0:-1].values
for i in range(ITEMS-1):
    data.insert(0, '{}Square'.format(i+2), base ** (i+2))

X = data.iloc[:, 0:-1]
sample_mean = X.mean().values
sample_std = X.std().values
X = (X - X.mean()) / X.std()
X.insert(X.shape[1] - 1, 'Ones', 1)

y = data.iloc[:, -1]

X = np.matrix(X.values)
y = np.matrix(y.values).T
theta = np.matrix(np.zeros(ITEMS + 1))

#%%
def computeCost(X, y, theta):
    inner = np.power(X * theta.T - y, 2)
    return np.sum(inner) / (2 * len(X))

#%% 
def gradientDescent(X, y, theta, alpha, epoch):
    N = X.shape[0]
    cost = np.zeros(epoch)
    for i in range(epoch):
        theta = theta - (alpha / N) * (X * theta.T - y).T * X
        cost[i] = computeCost(X, y, theta)
    return theta, cost
#%%
#迭代次数增加到一万后和矩阵法的结果一致
alpha = 0.01
epoch = 1000
solution, cost = gradientDescent(X, y, theta, alpha, epoch)

x = np.linspace(data.Population.min(), data.Population.max(), 100)

x_extend =  (np.array(x, ndmin=2) - sample_mean[-1]) / sample_std[-1]
for i in range(ITEMS-1):
    x_extend = np.insert(x_extend, 0, values = (x ** (i+2)-sample_mean[-i-2]) / sample_std[-i-2], axis=0)
x_extend = np.insert(x_extend, ITEMS, values = 1, axis = 0)

pred = np.matrix(x_extend.T) * solution.T

fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(x, pred, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Training Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs Population Size')
plt.show()


#%% 
#梯度下降过程
fig, ax = plt.subplots()
ax.plot(np.arange(epoch), cost, 'r')
plt.show()

代码如上,梯度下降很快就收敛了,但是最后拟合出来的曲线和理想情况相去甚远,一直是单调递增的,不管是四次还是十次拟合,都是一个形状,请问大家这是为什么呢?



 

cbshnrh   2019-07-11 17:59



   2个回答 
0

图像看起来是一波三折的,但是未必就是多项式能够拟合的吧,毕竟多项式也不能拟合任意函数。

这种形状不如试试分段的线性回归。

SofaSofa数据科学社区DS面试题库 DS面经

东布东   2019-07-12 14:43

0

你这只是一阶的线性回归。要用到$x^2$,$x^3$,$x_ix_j$这类高阶输入的线性回归才是多项式回归。

SofaSofa数据科学社区DS面试题库 DS面经

Zealing   2019-07-12 23:40



  相关主题

对进行回归分析之前,如何处理不同类型的变量?   1回答

statsmodels里的ols怎么处理分类变量?   1回答

线性回归的变量归一化的问题   1回答

数据的标准化(Z-score标准化)是否会改变训练得到的超平面系数向量?   1回答

拟合数据的Z-score规范化怎么进行操作?   2回答

怎么对特征做标准化使得数值都是正数?   3回答

在数据预处理阶段,特征的标准化有哪些方法?   1回答

什么时候需要对y或者特征进行对数变换?   1回答

在训练前数据处理的时候,怎么剔除异常值?   2回答

z-score标准化不适用于处理什么样的数据?   1回答

dummy variable是n个还是n-1个   3回答

如果迫使一个线性回归模型的截距为0,会有什么坏处吗?   2回答



回答问题时需要注意什么?

我们谢绝在回答前讲“生动”的故事。

我们谢绝“这么简单,你自己想”、“书上有的,你认真看”这类的回答;如果你认为对方的提问方式或者内容不妥,你可以直接忽略该问题,不用进行任何作答,甚至可以对该问题投反对票。

我们谢绝答非所问。

我们谢绝自己不会、硬要回答。

我们感激每一个用户在编写答案时的努力与付出!