Python 机器学习之线性回归详解分析

为了检验自己前期对机器学习中线性回归部分的掌握程度并找出自己在学习中存在的问题,我使用C语言简单实现了单变量简单线性回归。

本文对自己使用C语言实现单变量线性回归过程中遇到的问题和心得做出总结。

线性回归

线性回归是机器学习和统计学中最基础和最广泛应用的模型,是一种对自变量和因变量之间关系进行建模的回归分析。

代码概述

本次实现的线性回归为单变量的简单线性回归,模型中含有两个参数:变量系数w、偏置q。

训练数据为自己使用随机数生成的100个随机数据并将其保存在数组中。采用批量梯度下降法训练模型,损失函数使用平方损失函数。

上图为整个程序的函数调用关系。

下面贴代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>

double w, q;
int m;
//模型
float Model(float x)
{
	float y;
	y = x * w + q;
	return y;
}

//损失函数
double Loss(float *y,float *x)
{
	double L=0;
	//循环参数
	int i, j, k;
	for (i = 0; i < m; i++)
	{
		L += (pow((y[i] - Model(x[i])), 2)) / (2 * m);
	}
	return L;

}

//梯度下降优化函数
void Gradient_Descent_Optimizer(float *x,float *y,float a)
{
	int j, i;
	double Q = 0, W = 0;
	for (i = 0; i < m; i++)
		W += x[i] * (Model(x[i]) - y[i]);
	W = W / m;
	for (j = 0; j < m; j++)
		Q += Model(x[j]) - y[j];
	Q = Q / m;
	printf("W:%f\nQ:%f\n", W, Q);
	w = w - a * W;
	q = q - a * Q;
}

//主函数;训练过程
int main()
{
	//循环标志
	int i, j;
	//训练轮次
	int epoch;
	//损失函数
	double L;
	//学习率
	float a;
	float x[100], y[100];
	//随机数生成
	for (i = 0; i < 100; i++)
	{
		x[i] = 0.1*i;
		y[i] = x[i] * 3 + 5; //+ ((rand() % 11) / 10);
		printf("X:%.2f,Y:%.2f\n", x[i], y[i]);
	}
	//超参数设置
	m = 100;
	a = 0.05;
	epoch = 1000;
	//参数初始化
	w = 2;
	q = 3;
	for (j = 0; j < epoch; j++)
	{
		Gradient_Descent_Optimizer(x, y, a);
		L = Loss(y, x);
		printf("训练轮次:%d,损失:%f,参数w的值:%lf,参数q的值:%lf\n", j+1, L, w, q);
	}
	printf("最终值:\nw:%lf\nq:%lf\n", w, q);
	system("pause");
}

问题总结

下面对在编写过程中需要注意的问题进行总结:

1.参数更新

模型中的参数需要同步更新。所有参数的更新值经过梯度下降法计算得出后要在最后同时更新所有参数。

2.保留损失函数

在代码编写过程中自己认为不用单独写一个损失函数,只需在梯度下降的过程中利用求导后的公式进行相关的参数优化操作即可,但在运行没有算是函数的程序时,没有实时的损失函数结果评估模型训练效果可能会导致模型在错误的道路上越走越远。

3.注意数据类型

初次运行程序,在训练至十几轮时参数就不再变化,一直到第1000轮参数都保持不变。后来在检查代码时发现,在优化函数将一些参数的数据类型错误设置为整型。因此当参数值改变程度小于1时,参数将不再变化。

4.超参数的设置及参数的初始化

学习率,训练轮次等的设置是一个对程序编写者经验要求比较高的工作,需要多次尝试,找到合适的值,参数的初始化也是这样。

心得

本次只是实现了简单线性回归的最基本的功能,同时也试一下自己刚买的机械键盘(用起来真的很舒服)。这只是我用来练手的程序,如果真的要编写程序实现功能还是推荐使用python语言搭配TensorFlow、Pytorch等深度学习平台实现自己想要的功能。程序的可完善空间非常大,比如数据和模型的可视化,将数据和模型的训练效果直观的展示出来,后面还会有序的用C语言实现诸如多元线性回归,二分类问题,多分类问题甚至卷积神经网络等等。我会在下面贴出使用Python语言编写的线性回归的程序,可以两者结合起来比较一下异同。

# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np

np.random.seed(5)

x_data = np.linspace(-1,1,100)
y_data = 2 * x_data + 1.0 + np.random.randn(*x_data.shape) * 0.4

np.random.randn(10)

#x_data.shape

#np.random.randn(*x_data.shape)
#np.random.randn(100)
plt.scatter(x_data,y_data)
plt.plot(x_data, 2 * x_data + 1.0, color = 'red',linewidth=3)

x = tf.placeholder("float",name="x")
y = tf.placeholder("float",name="y")

def model(x,w,b):
    return tf.multiply(x,w)+b

w = tf.Variable(1.0,name="w0")
b = tf.Variable(0.0,name="b0")

pred = model(x,w,b)

train_epochs = 10
learning_rate = 0.05

loss_function = tf.reduce_mean(tf.square(y-pred))

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)

sess = tf.Session()

init = tf.global_variables_initializer()
sess.run(init)

i_ci=0

for epoch in range(train_epochs):
    for xs,ys in zip(x_data,y_data):
        _, loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        b0temp=b.eval(session=sess)
        w0temp=w.eval(session=sess)
    plt.plot(x_data,w0temp*x_data+b0temp)

print("w:",sess.run(w))
print("b:",sess.run(b))

plt.scatter(x_data,y_data,label='Original data')
plt.plot(x_data,x_data*sess.run(w)+sess.run(b),label='Fitted Line',color='r',linewidth=3)
plt.legend(loc=2)

到此这篇关于Python 机器学习之线性回归详解分析的文章就介绍到这了,更多相关Python 机器学习内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 机器学习之支持向量机非线性回归SVR模型

    本文介绍了python 支持向量机非线性回归SVR模型,废话不多说,具体如下: import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm from sklearn.model_selection import train_test_split def load_data_regression(): ''' 加载用于回归问题的数据集 ''' diabetes =

  • python实现机器学习之元线性回归

    一.理论知识准备 1.确定假设函数 如:y=2x+7 其中,(x,y)是一组数据,设共有m个 2.误差cost 用平方误差代价函数 3.减小误差(用梯度下降) 二.程序实现步骤 1.初始化数据 x.y:样本 learning rate:学习率 循环次数loopNum:梯度下降次数 2.梯度下降 循环(循环loopNum次): (1)算偏导(需要一个for循环遍历所有数据) (2)利用梯度下降数学式子 三.程序代码 import numpy as np def linearRegression(d

  • python机器学习之线性回归详解

    一.python机器学习–线性回归 线性回归是最简单的机器学习模型,其形式简单,易于实现,同时也是很多机器学习模型的基础. 对于一个给定的训练集数据,线性回归的目的就是找到一个与这些数据最吻合的线性函数. 二.OLS线性回归 2.1 Ordinary Least Squares 最小二乘法 一般情况下,线性回归假设模型为下,其中w为模型参数 线性回归模型通常使用MSE(均方误差)作为损失函数,假设有m个样本,均方损失函数为:(所有实例预测值与实际值误差平方的均值) 由于模型的训练目标为找到使得损

  • python实现机器学习之多元线性回归

    总体思路与一元线性回归思想一样,现在将数据以矩阵形式进行运算,更加方便. 一元线性回归实现代码 下面是多元线性回归用Python实现的代码: import numpy as np def linearRegression(data_X,data_Y,learningRate,loopNum): W = np.zeros(shape=[1, data_X.shape[1]]) # W的shape取决于特征个数,而x的行是样本个数,x的列是特征值个数 # 所需要的W的形式为 行=特征个数,列=1 这

  • Python 机器学习之线性回归详解分析

    为了检验自己前期对机器学习中线性回归部分的掌握程度并找出自己在学习中存在的问题,我使用C语言简单实现了单变量简单线性回归. 本文对自己使用C语言实现单变量线性回归过程中遇到的问题和心得做出总结. 线性回归 线性回归是机器学习和统计学中最基础和最广泛应用的模型,是一种对自变量和因变量之间关系进行建模的回归分析. 代码概述 本次实现的线性回归为单变量的简单线性回归,模型中含有两个参数:变量系数w.偏置q. 训练数据为自己使用随机数生成的100个随机数据并将其保存在数组中.采用批量梯度下降法训练模型,

  • python机器学习算法与数据降维分析详解

    目录 一.数据降维 1.特征选择 2.主成分分析(PCA) 3.降维方法使用流程 二.机器学习开发流程 1.机器学习算法分类 2.机器学习开发流程 三.转换器与估计器 1.转换器 2.估计器 一.数据降维 机器学习中的维度就是特征的数量,降维即减少特征数量.降维方式有:特征选择.主成分分析. 1.特征选择 当出现以下情况时,可选择该方式降维: ①冗余:部分特征的相关度高,容易消耗计算性能 ②噪声:部分特征对预测结果有影响 特征选择主要方法:过滤式(VarianceThreshold).嵌入式(正

  • python机器学习基础线性回归与岭回归算法详解

    目录 一.什么是线性回归 1.线性回归简述 2.数组和矩阵 数组 矩阵 3.线性回归的算法 二.权重的求解 1.正规方程 2.梯度下降 三.线性回归案例 1.案例概述 2.数据获取 3.数据分割 4.数据标准化 5.模型训练 6.回归性能评估 7.梯度下降与正规方程区别 四.岭回归Ridge 1.过拟合与欠拟合 2.正则化 一.什么是线性回归 1.线性回归简述 线性回归,是一种趋势,通过这个趋势,我们能预测所需要得到的大致目标值.线性关系在二维中是直线关系,三维中是平面关系. 我们可以使用如下模

  • python http服务flask架构实用代码详解分析

    依赖库 flask安装,使用豆瓣源加速. pip install flask -i https://pypi.douban.com/simple gevent安装,使用豆瓣源加速. pip install gevent -i https://pypi.douban.com/simple 代码 #!/user/bin/env python # coding=utf-8 """ @project : TestDemo @author : huyi @file : app.py @

  • Python卷积神经网络图片分类框架详解分析

    [人工智能项目]卷积神经网络图片分类框架 本次硬核分享当时做图片分类的工作,主要是整理了一个图片分类的框架,如果想换模型,引入新模型,在config中修改即可.那么走起来瓷!!! 整体结构 config 在config文件夹下的config.py中主要定义数据集的位置,训练轮数,batch_size以及本次选用的模型. # 定义训练集和测试集的路径 train_data_path = "./data/train/" train_anno_path = "./data/trai

  • Python人工智能之混合高斯模型运动目标检测详解分析

    [人工智能项目]混合高斯模型运动目标检测 本次工作主要对视频中运动中的人或物的边缘背景进行检测. 那么走起来瓷!!! 原视频 高斯算法提取工作 import cv2 import numpy as np # 高斯算法 class gaussian: def __init__(self): self.mean = np.zeros((1, 3)) self.covariance = 0 self.weight = 0; self.Next = None self.Previous = None c

  • Python OpenCV机器学习之图像识别详解

    目录 背景 一.人脸识别 二.车牌识别 三.DNN图像分类 背景 OpenCV中也提供了一些机器学习的方法,例如DNN:本篇将简单介绍一下机器学习的一些应用,对比传统和前沿的算法,能从其中看出优劣: 一.人脸识别 主要有以下两种实现方法: 1.哈尔(Haar)级联法:专门解决人脸识别而推出的传统算法: 实现步骤: 创建Haar级联器: 导入图片并将其灰度化: 调用函数接口进行人脸识别: 函数原型: detectMultiScale(img,scaleFactor,minNeighbors) sc

  • Python MNIST手写体识别详解与试练

    [人工智能项目]MNIST手写体识别实验及分析 1.实验内容简述 1.1 实验环境 本实验采用的软硬件实验环境如表所示: 在Windows操作系统下,采用基于Tensorflow的Keras的深度学习框架,对MNIST进行训练和测试. 采用keras的深度学习框架,keras是一个专为简单的神经网络组装而设计的Python库,具有大量预先包装的网络类型,包括二维和三维风格的卷积网络.短期和长期的网络以及更广泛的一般网络.使用keras构建网络是直接的,keras在其Api设计中使用的语义是面向层

  • Facebook开源一站式服务python时序利器Kats详解

    目录 什么是 Kats? 安装 Kats 将数据转换为时间序列 预测 从使用 Prophet 进行预测开始: 可视化 Holt-Winters 检测变化点 机器学习 深度学习 孤立点检测 时间序列特征 小结 转自微信公众号:机器学习社区,经作者授权转载 时间序列分析是数据科学中一个非常重要的领域,它主要包含统计分析.检测变化点.异常检测和预测未来趋势.然而,这些时间序列技术通常由不同的库实现.有没有一种方法可以让你在一个库中获得所有这些技术? 答案是肯定的,本文中我将分享一个非常棒的工具包 Ka

随机推荐