当前位置:   article > 正文

机器学习入门之线性回归(2)- 多特征(python实现)_python 多特征数据训练

python 多特征数据训练

一、知识储备

  1. 对于线性回归多特征的知识上篇博客单特征均已涉及,由于特征数量的变化,我们应该求得的方程是更高维,本篇介绍两个特征的线性回归,原因是由于两个特征我们可以画出三维的图像,看到拟合后的平面,同时也可以将特征处理归一化。当然,如果特征数量较多,维度较高,出于泛化性与稳定性考虑,我们也需要处理特征,处理特征可以如以下两种方式:
    ① 减少特征的数量:可以由人工检查、PCA或者模型自己选择哪些重要
    正则化:在上篇博客中有提到,指在损失函数中加上惩罚项,让高阶的特征(高阶的特征指假设函数对应的特征变量的指数太大的项,例如 θ 1 x 1 10 + θ 2 x 2 + θ 0 \theta_1x_1^{10}+\theta_2x_2+\theta_0 θ1x110+θ2x2+θ0,此时显然特征 x 1 x_1 x1的阶数较高,我们就尽量减少 θ 1 的 数 值 \theta_1的数值 θ1,让 x 1 x_1 x1对整个函数的影响变小)对应的系数 θ j \theta_j θj变得非常小,这样就会减少高阶特征对函数的影响,从而降低了量级,使维度减少)

通过上述两种方式,我们可以将复杂的方程简单化,维度降低。

  1. 回归本文的两个特征的处理,假设函数如下(具体这样设的原因不解释了,如由疑问可以看一下上篇博客介绍):
    h θ ( x ) = θ 1 x 1 + θ 2 x 2 + θ 0 h_\theta(x)=\theta_1x_1+\theta_2x_2+\theta_0 hθ(x)=θ1x1+θ2x2+θ0
  2. 用的依然是批量梯度下降,在上篇博客中有详细的介绍,这里不介绍了,有需求的可以看一下上一篇博客。
  3. 这里主要介绍一下我用的归一化的方法,事实上有很多归一化的方法,其中较为经典的是,求出各列所有特征的均值和标准差,然后用各个特征减去对应的该列特征的均值再除以标准差,即可得到每个特征保持在-2~2之间。下面使用python代码实现的归一化:
# 特征归一化 减去平均值并除以对应特征的标准差
s_std = np.std(trans_data_x_data,axis=0) #求标准差
average = np.mean(trans_data_x_data,axis=0) # 求均值
trans_data_x = (trans_data_x_data - average) / s_std # 归一化
  • 1
  • 2
  • 3
  • 4

二、代码实现

  1. 读取与处理数据、拟合图、误差图代码,文件名:mutilinerregress.py
from cgi import test
import imp
from math import ceil, floor
from time import process_time_ns
from turtle import dot
import numpy as np
import matplotlib.pyplot as plt
from mutigradient import grandientFun
origin_data = np.loadtxt(fname='ex1data2.txt',delimiter=',')

features_array = origin_data[:,0:2]
yvalue_array = origin_data[:,2]
print(np.size(features_array))
print(np.size(yvalue_array))
theta=np.array([0.1,0.2,0.1])
# 训练数据与测试数据区分,np.size()计算的是左右特征的和
trans_data_x_data = features_array[0:int(0.7*(np.size(features_array)/2))]
test_data_x = features_array[-ceil(0.3*(np.size(features_array)/2)):]
trans_data_y = yvalue_array[0:int(0.7*(np.size(yvalue_array)))]
test_data_y = yvalue_array[-ceil(0.3*(np.size(yvalue_array))):]
# 特征归一化 减去平均值并除以对应特征的标准差
s_std = np.std(trans_data_x_data,axis=0)
average = np.mean(trans_data_x_data,axis=0)
trans_data_x = (trans_data_x_data - average) / s_std
# 2418295.00404542
grandient_trans_data_x = np.array_split(trans_data_x,15)
print(trans_data_x)
grandient_trans_data_y = np.array_split(trans_data_y,15)
j_error_array = np.array([])
i = 0
j = 0

while True:
    ones = np.ones((1,int(np.size(grandient_trans_data_x[i])/2)),dtype='int')
    a =np.insert(grandient_trans_data_x[i],0,values=ones,axis=1)
    y=np.dot(theta,a.T)
    error_array = y-trans_data_y[i]
    # j_error=np.sum(np.power(error_array,2))/(np.size(grandient_trans_data_x[i]))
    theta = grandientFun(a,error_array,theta=theta)
    if i==14:
        j+=1
        i=0
        # 加一列 1 ,与theta0相乘,不改变theta0的值
        error_ones = np.ones((1,int(np.size(trans_data_y))),dtype='int')
        error_x =np.insert(trans_data_x,0,values=error_ones,axis=1)
        y=np.dot(theta,error_x.T)
        error_array_y = y-trans_data_y
       j_error=np.dot(error_array_y,error_array_y.T)/(np.size(trans_data_y)*2)
        print(np.size(trans_data_y))
        j_error_array=np.concatenate((j_error_array,np.array([j_error])),axis=0)
    if j==70:  #6
        break
    i+=1



# 画出优化过程
index = np.arange(0,np.size(j_error_array)).reshape(np.size(j_error_array))
plt.plot(index,j_error_array)
plt.show()
fig = plt.figure()
ax = fig.gca(projection="3d")
# 画出三维的点与拟合的模型所对应的平面
feature_s_std = np.std(features_array,axis=0)
feature_average = np.mean(features_array,axis=0)
feature_data_x = (features_array - feature_average) / feature_s_std
ax.scatter(feature_data_x[:,0],feature_data_x[:,1], zs=yvalue_array, zdir="z", c="#00DDAA", marker="x", s=40)
ax.set(xlabel="X1", ylabel="X2", zlabel="y")
ones = np.ones((1,int(np.size(feature_data_x)/2)),dtype='int')
a =np.insert(feature_data_x,0,values=ones,axis=1)
y=np.dot(theta,a.T)
print(y-yvalue_array)
ax.plot_trisurf(feature_data_x[:,0],feature_data_x[:,1], y,
    color='g',
    alpha=1
    ) 
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  1. 下面是梯度下降函数,文件名为:mutigradient.py
import numpy as np
def grandientFun(group_x,error_array,theta):
    alpha = 0.008
    # theta_feature = theta[1:]
    theta = theta - alpha*np.dot(error_array,group_x)/(np.size(error_array))
    print('损失为{}'.format(error_array))
    print('\ntheta的值为{}'.format(theta))
    return theta
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.则我们可以得到下面的拟合图与优化过程图
拟合图
模型拟合图像

以上若有问题,请大佬指出,感激不尽,共同进步。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/564095
推荐阅读
相关标签
  

闽ICP备14008679号