栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

使用梯度下降训练线性模型

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用梯度下降训练线性模型

这里可以使用多种方法

由numpy.random.multivariate_normal(mean, cov[, size, check_valid, tol]).直接生成。先由np.random.randn()生成一维的正态分布 再转化为2维正态。

代码如下所示

import numpy as np
from numpy.linalg import cholesky
import matplotlib.pyplot as plt
import pandas as pd
sampleNo 250
mu np.array([1, -1])
mu2 np.array([-1, 1])
Sigma np.array([[1, 0], [0, 1]])
s1 np.random.multivariate_normal(mu, Sigma, sampleNo)
s1 np.random.multivariate_normal(mu2, Sigma, sampleNo)
# R cholesky(Sigma).T
# va, vc np.linalg.eig(Sigma)
# R2 (np.diag(va) ** 0.5) vc.T
# s1 np.random.randn(sampleNo, 2) R mu
# s2 np.random.randn(sampleNo, 2) R mu2

生成数据后 我们使用matplotlib对数据可视化如下

plt.plot(*s1.T, . , label s1 )
plt.plot(*s2.T, . , label s2 )
plt.axis( scaled )
plt.legend()
plt.show()

最后 我们为两类数据打上Label 再打乱后存入csv文件。

data1 pd.Dataframe(s1)
data1[ label ] 1
data2 pd.Dataframe(s2)
data2[ label ] -1
data pd.concat([data1, data2])
data0 data.sample(frac 1)
data0.to_csv( data0.csv , header False, index False)
数据读取与处理

从csv文件中读取数据 按照8:2的比例划分训练集与测试集 并对数据添加常数1 构造常数项。

def init_data(a 0.8):
 data np.loadtxt( data0.csv , delimiter , )
 index_m round(data.shape[0]*a)
 traindata data[:index_m]
 testdata data[index_m:]
 train_x, train_y data_p(traindata)
 test_x, test_y data_p(testdata)
 return train_x, train_y, test_x, test_y
def data_p(dataIn):
 dataMatIn dataIn[:, 0:-1]
 classLabels dataIn[:, -1]
 dataMatIn np.insert(dataMatIn, 0, 1, axis 1) #特征数据集 添加1是构造常数项x0
 return dataMatIn, classLabels
法一 利用最小二乘求解线性分类

代码为

def Leastsquare(train_x, train_y):
 # 最小二乘法
 H train_x
 H0 np.array(H)
 # H1为H的转置矩阵
 H1 np.array(H0).T
 H2 H1 H0
 # 求逆矩阵
 H3 np.linalg.inv(H2)
 # 最终结果计算
 W H3 H1 train_y
 # W grad_descent(train_x, train_y)
 return W
法二 利用线性分类 梯度下降

代码

def grad_descent_mse(dataMatIn, classLabels, maxCycle 500):
 dataMatrix np.mat(dataMatIn) # (m,n)
 labelMat np.mat(classLabels).transpose()
 m, n np.shape(dataMatrix)
 weights np.ones((n, 1)) # 初始化回归系数 n, 1)
 alpha 0.001 # 步长
 # 最大循环次数默认为500
 for i in range(maxCycle):
 y_hat dataMatrix * weights
 weights weights - alpha * dataMatrix.transpose()*(y_hat - labelMat).reshape(-1,1)
 return weights
法三 利用逻辑回归 梯度下降 随机梯度下降

使用随机梯度下降与动态调整步长的随机梯度下降。

 
sigmoid函数
def sigmoid(inX):
 return 1.0 / (1 np.exp(-inX))
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/268104.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号