机器学习之线性回归

article/2025/8/25 1:09:03
线性回归是最简单的一个函数拟合过程,一元线性回归公式为y=ax+b。
我们做拟合,首先需要定义一个损失函数。一般常用的损失函数有:

0-1损失函数和绝对值损失函数

  0-1损失是指,预测值和目标值不相等为1,否则为0:

  感知机就是用的这种损失函数。但是由于相等这个条件太过严格,因此我们可以放宽条件,即满足时认为相等。

 

绝对值损失函数:

 

 

log对数损失函数

  Logistic回归的损失函数就是对数损失函数,在Logistic回归的推导中,它假设样本服从伯努利分布(0-1)分布,然后求得满足该分布的似然函数,接着用对数求极值。Logistic回归并没有求对数似然函数的最大值,而是把极大化当做一个思想,进而推导它的风险函数为最小化的负的似然函数。从损失函数的角度上,它就成为了log损失函数。

  log损失函数的标准形式:

 

  在极大似然估计中,通常都是先取对数再求导,再找极值点,这样做是方便计算极大似然估计。损失函数L(Y,P(Y|X))是指样本X在标签Y的情况下,使概率P(Y|X)达到最大值(利用已知的样本分布,找到最大概率导致这种分布的参数值)。

 

平方损失函数

  最小二乘法是线性回归的一种方法,它将回归的问题转化为了凸优化的问题。最小二乘法的基本原则是:最优拟合曲线应该使得所有点到回归直线的距离和最小。通常用欧式距离进行距离的度量。平方损失的损失函数为:

 

指数损失函数

  AdaBoost就是一指数损失函数为损失函数的。

  指数损失函数的标准形式:

 

Hinge损失函数

  Hinge loss用于最大间隔(maximum-margin)分类,其中最有代表性的就是支持向量机SVM。

  Hinge函数的标准形式:

 

  

(与上面统一的形式:

  其中,t为目标值(-1或+1),y是分类器输出的预测值,并不直接是类标签。其含义为,当t和y的符号相同时(表示y预测正确)并且|y|≥1时,hinge loss为0;当t和y的符号相反时,hinge loss随着y的增大线性增大。

以上参考https://www.cnblogs.com/hejunlin1992/p/8158933.html

作为回归问题,一般我们定义损失函数为均方误差。error = sum((y_true-y_predict)**2)/float(N)y_true真实label,y_predict预测label,N样本总数,**2代表平方,y=ax+b有了损失函数,我们就有了方向,好比大海中的灯塔一样。我们最后需要的函数拟合是最小化损失函数,那么根据大学的高数知识,我们进行求极值,分别对w和b求偏导,我们粘贴已有的公式,m就是上面的w

这里写图片描述

这里写图片描述


根据公式,就可以直接求出w和b的取值。一般的话我们使用梯度下降的算法去不断的更新w和b,使误差不断降到最小。


这里写图片描述

这里写图片描述


这两个公式就是w和b更新的方向,我们要沿着负梯度方向进行更新,所以w,b应该加上负梯度,lr为学习率

 w = w - (lr * w_gradient)b = b - (lr * b_gradient)具体实现代码如下,另外和sklearn库里面的线性回归做了下对比。发现效果好于库里面的,或许与样本有关系。 
#coding:utf-8
from sklearn.linear_model import  LinearRegression
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
import pylab
def compute_error(w,b,data_x,data_y):
    total_error= np.sum((data_y - data_x*w -b)**2)
    return total_error/float(len(data_y))

def compute_gradient(w,b,data_x,data_y,lr=0.001):
    data_l = float(len(data_y))
    w_gradient = -(2 / data_l)*data_x*(data_y - data_x*w - b)#最小二乘法对w的偏导公式
    w_gradient = np.sum(w_gradient,axis=0)
    b_gradient = -(2 / data_l) * (data_y - data_x*w-b)#最小二乘法对b的偏导公式
    b_gradient = np.sum(b_gradient,axis=0)
    w = w - (lr * w_gradient)
    b = b - (lr * b_gradient)
    return  w,b

if __name__ == "__main__":
####============================读取数据==============================
    data = np.loadtxt('data.csv', delimiter=',')
    data_x = data[:,0]
    data_y = data[:,1]
    data_x = np.reshape(data_x,(len(data_x),1))
    data_y = np.reshape(data_y, (len(data_y), 1))
    x_train, x_test, y_train, y_test = train_test_split(data_x, data_y,random_state=1,train_size=0.9)
###============================调用库效果不好本数据集中=================================
    # print len(y_train)
    # linreg = LinearRegression()
    # model = linreg.fit(x_train, y_train)
    # print model
    # print linreg.coef_
    # print linreg.intercept_
    # #
    # y_hat = linreg.predict(np.array(x_test))
    # mse = np.average((y_hat - np.array(y_test)) ** 2)  # Mean Squared Error0.869
    # rmse = np.sqrt(mse)  # Root Mean Squared Error##0.932
    # print mse, rmse
    # t = np.arange(len(x_test))
    # plt.plot(t, y_test, 'r-', linewidth=2, label='Test')
    # plt.plot(t, y_hat, 'g-', linewidth=2, label='Predict')
    # plt.legend(loc='upper right')
    # plt.grid()
    # plt.show()
    # pylab.plot(x_test,y_test,'o')
    # pylab.plot(x_test,y_hat,'k-')
    # pylab.show()
##==================梯度更新=================================
    data = np.loadtxt('data.csv', delimiter=',')
    data_x = data[:,0]
    data_y = data[:,1]
    data_x = np.reshape(data_x,(len(data_x),1))
    data_y = np.reshape(data_y, (len(data_y), 1))
    x_train, x_test, y_train, y_test = train_test_split(data_x, data_y,random_state=1,train_size=0.9,shuffle=False)
    print compute_error(0,0,data_x,data_y)
    w = 0
    b = 0
    for i in range(2000):
        w,b = compute_gradient(w=w,b=b,data_x=x_train,data_y=y_train,lr=0.001)
        if i%100==0:
            print 'iter {0}:error={1}'.format(i,compute_error(w=w,b=b,data_x=x_train,data_y=y_train))
    print w,b
    y_pred = x_test * w +b
    mse = np.average((y_pred - np.array(y_test)) ** 2)  # Mean Squared Error#0.674
    rmse = np.sqrt(mse)  # Root Mean Squared Error#0.821
    print "mse",mse
    print "rmse",rmse
    # t = np.arange(len(x_test))
    # plt.plot(t, y_test, 'r-', linewidth=2, label='Test')
    # plt.plot(t, y_pred, 'g-', linewidth=2, label='Predict')
    # plt.legend(loc='upper right')
    # plt.grid()
    # plt.show()
    pylab.plot(x_test,y_test,'o')
    pylab.plot(x_test,y_pred,'k-')
    pylab.show()

训练x,y如下

1    3
1.2    3
1.2    4
1.5    4.5
1.6    4.3
6.5    12
3.6    7.1
2.5    9
5.7    14
6    11
9    17
8.9    17
7.1    15
7    14
2.5    4
0.8    2
0.5    2
3.4    7
3.6    9
5.6    12
6.7    15
6.9    15
7.1    14
7.5    17
7.8    16
8.1    15
8.3    15
8.5    15
8.7    16
8.7    17
8.8    18
8.8    20
8    16
9    19
9.2    18
10.1    20
1.1    3.2
1.6    4.2
4    9
12    25
9.5    20


http://chatgpt.dhexx.cn/article/WT6twkkr.shtml

相关文章

在线Cron表达式生成器,定时任务表达式生成器

近期项目需要在后台管理系统的页面上生成定时任务表达式存入定时任务系统的数据库中,就是那种根据后台管理员指定的时分秒年月日生成一个定时任务表达式。 一时间有点不好下手。我可以根据后台管理员指定的时分秒年月日手动写一个定时任务表达式,也可以…

在线QuartzCron定时任务表达式在线生成

在线QuartzCron定时任务表达式在线生成 在线QuartzCron定时任务表达式在线生成 Quartz是一个完全由java编写的开源作业调度框架,Quartz最主要的功能就是调度器(完成定时任务)。本工具可以在线生成QuartzCron表达式 Quartz是一个完全由java编写的开源作业调度框架,Quartz最主要…

Android Studio修改应用名称及应用图标

一、修改应用名称 找到src/main/AndroidManifest.xml文件: android:label后面配置的就是应用名称配置路径或应用名称。 方式1:android:label"xxx应用"(应用名称显示xxx应用) 方式2:android:label"st…

Android修改应用程序图标和名字

Android修改应用程序图标和名字 对于一个APP应用程序来说,最鲜明的就是APP的图标和名字了。 修改应用图标 在res/drawable中保存一个jpg或者png的图片文件。(png支持透明度) 例:在drawable中保存icon.jpg文件修改AndroidManifest.xml中application的a…

flutter 修改app名字和图标(安卓)

安卓 修改名字: 找到flutter项目下面的android>app>src>main>AndroidManifest.xml 修改里面的android:label"改成你要的名字" 修改图标: 找到android>app>src>main>res里面的mipmap-xx文件夹修改里面的图标 一件生成多种格式的图标: http…

android studio修改app图标

一、修改图标文件 1.找到项目下的多个mipmap-目录(如下图),将要修改的图片在每个目录中都放入一份 2.再找到mipmap-anydpi-v26目录(如下图),修改目录中两个文件的内容,使其指向我们上一步放入的…

如何修改安卓应用图标和程序名称

安卓修改大师可以在没有源代码的情况下,直接反编译已经打包的APK安装包,通过修改SMALI代码实现添加和去除部分功能,也可以通过修改应用图标和应用程序名称实现个性化应用,甚至可以通过修改应用程序配置参数(内置统计参…

修改app图标

修改app图标 1.准备三个尺寸的.png图片 (注:一定要是.png后缀的图片),分别命名为xx.png, xx2x.png, xx3x.png; 2.在项目中找到项目->Resource->AppLogo,把三个尺寸的图片拉入项目中,选择Copy items if needed、Create gr…

如何修改软件名称及图标,非常详细

所需工具 MT管理器:下载 理论: 补充android:versionName"2.4"是版本号 实战: 修改图标 wzry.png就是刚刚复制进来的图片名称 图标修改完成 下面开始修改名称:

iOS开发技巧:设置App icon图标及修改应用程序名

前言 这是iOS开发技巧系列博客的第二篇,本篇主要简单介绍一下如何设置应用程序的icon图标以及修改应用程序名。 设置 icon 首先我们来看看如何设置App icon图标,设置应用程序的icon图标主要有两种方法: 第一种:通过项目的Imag…

更换app图标和名称

更换app图标和名称 参考地址: https://blog.csdn.net/pla12147111/article/details/97684488 预装:预装雷电模拟器3.59 和 AndroidKiller.exe 打开后等待反编译成功 更换文字,首先在模拟器中安装app查看app图标和名称 打开工具&#xf…

Android Studio中修改APP图标和APP名称

Android Studio生成的APP默认图标是经典的机器人图标。可以通过Android Studio实现APP图标和名称的修改。 1 修改APP图标 在程序对应的AndroidMenifest.xml中指定了该APP的图标。 <application>......android:icon"mipmap/ic_launcher"</application>…

如何修改Android APP的图标和名字

看看下图中红框包围的一款APP的图标和名称&#xff0c;如何在Android中进行修改呢&#xff1f; 修改主要在manifest.xml&#xff08;项目清单&#xff09;中&#xff1a; FR&#xff1a;海涛高软&#xff08;QQ技术交流群&#xff1a;386476712&#xff09;

Android Studio修改app图标以及名字

1. 修改名字&#xff1a; Android–>AndroidManifest.xml–>android:label属性 点击属性值&#xff0c;实现跳转&#xff0c;改变名字 2. 修改图标 准备5种尺寸的相同图标&#xff1a;&#xff08;48 * 48&#xff0c;72 * 72&#xff0c;96 * 96&#xff0c;144 * …

如何修改安卓app图标和名称

1、安卓app图标定义处 图标定义位置在AndroidManifest.xml文件manifest->application->android:icon"drawable/tubiao",修改成自己喜欢的图片就行&#xff0c;如下图&#xff1a; 安卓图标定义处 修改后效果图&#xff1a; 安卓图标修改后效果 2、安卓app项目…

Android Studio 修改app名字和图标

修改图标 将准备好的图标放入res目录下的drawable里 在AndroidManifest.xml文件中&#xff0c;找到android:icon以及android:roundIcon这两个属性,设置为你放入的图标文件。 如图&#xff0c;music3就是准备替换的文件。注意保存时&#xff0c;保存名称不能有大写字母与空格&…

AS-修改APP图标和名字

修改名称&#xff1a; 1&#xff0c;可以通过修改图标地址&#xff0c;百度查的这个方法 没试过 2&#xff0c;直接找到图标文件夹 用新的图标 图标替代原来的图片

android studio 如何修改app名字、修改app图标

1.如何修改app名字 直接在文件AndroidManifest.xml中的android:label”string/app_name”去修改即可&#xff0c;直接去修改app_name中的名字&#xff0c;中、英文都是可以的&#xff1b; 修改后&#xff0c;手机安装完就如图 注意&#xff1a;项目的versionName、versionCode…

如何改变Android-studio中的APP的名字和图标

1.更改APP的名字 1&#xff09;&#xff1a;我们打开app-->manifests-->AndroidManifest.xml 更改Android&#xff1a;lable""引号之中的文字即可。 在这里我们改为QQ 运行结果如下图&#xff1a; 在打代码时我们尽量不用手打&#xff0c;使用软件的提示&…

如何使用git下载别人在github的代码?

今天东哥让我帮他们公司检查一下几十款产品的前端代码&#xff0c;我用新电脑作业了一下&#xff0c;简单分享git如何下载别人的代码。 完整教程请参考我上篇文章&#xff1a;——> Git教程学习总结 首先本地有git环境。打开git bash here。 查看一下版本 初始化git使…