机器学习教程 之 线性模型:线性回归、对数几率回归、线性判别分析

article/2025/8/15 4:17:38

常用的三个线性模型的原理及python实现——线性回归(Linear Regression)、对数几率回归(Logostic Regression)、线性判别分析(Linear Discriminant)。 这可能会是对线性模型介绍最全面的博客

文章目录

    • 一、线性模型 (Linear Model)
    • 二、线性回归 (Linear Regression)
    • 三、对数几率回归(Logistic Regression)
    • 四、线性判别分析(Linear Discriminant Analysis)
    • 五、三个模型结果对比图
    • 六、更多资源下载

一、线性模型 (Linear Model)

对于一个具有d个属性的对象来说,我们可以用下面这一组向量描述

这里写图片描述

向量中的每个值都是对象一个属性的值,由上可以看出,线性模型是一个通过属性的线性组合来进行对象判定的函数,即

这里写图片描述

用向量的形式可以写成

这里写图片描述

其中

这里写图片描述

当求得wb后,线性模型就得以确定。线性模型是最简单也是最常用的模型之一,同时,很多更为强大的非线性模型也是由线性模型发展来的,所以,了解掌握线性模型十分必要

二、线性回归 (Linear Regression)

线性回归是指,模型试图学得

这里写图片描述

求解模型的关键在于,如何求得wb,解决问题的落点在于,如何衡量f(x)y 差距,通常我们使用均方误差来衡量这种差距的大小,即

这里写图片描述

均方差有非常良好的几何意义,它对应了常用的欧几里得距离即“欧式距离”。基于均方误差最小化的原理来求解模型的方法叫做“最小二乘法”(least square method),在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧式距离之和最小,现令

这里写图片描述

将其对wb分别求导,并令其导数为0,可得

这里写图片描述

对于更一般的情形,若样本由d个属性描述,此时我们应当求解

这里写图片描述

这就是我们通常所说的多元线性回归(multivariate linear regression)
现在利用最小二乘法对w和b进行估计。将wb统一记为

这里写图片描述

同时也把数据集D表示为一个 *m x (d + 1)*的矩阵 X

这里写图片描述

将标记也写成向量形式

这里写图片描述

此时的求解方程可以写为

这里写图片描述

用上式对w进行求导,当X 的转置与其相乘为满秩矩阵或者正定矩阵时,令导数为0可得

这里写图片描述

最终得到的多元线性回归模型如下

这里写图片描述

基于上述理论,其python源码如下:


'''
1.using least square method figure out linear regression
'''
import numpy as np
import matplotlib.pyplot as pltdef linear_regression(x,y):     def preprocess(x):X = np.mat(x)b = np.mat([1]*len(x))X = np.hstack((X,b.T))return Xdef cal_w(x,y):X = preprocess(x)Y = np.mat(y).Treturn (X.T*X).I*X.T*Y     return preprocess(x)*cal_w(x,y),cal_w(x,y).tolist()

其测试代码如下(注本文所有的代码原为一个文件,运行时,请完整复制全部代码)


#visiable and output test
x = [[0.697,0.460],[0.774,0.376],[0.634,0.264],[0.608,0.318],[0.556,0.215],[0.403,0.237],[0.481,0.149],[0.437,0.211],[0.666,0.091],[0.243,0.267],[0.245,0.057],[0.343,0.099],[0.639,0.161],[0.657,0.198],[0.360,0.370],[0.593,0.042],[0.719,0.103]]
y = [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0]
yy,w = linear_regression(x,y)
i,x1,x2 = 0,[],[]
while i < len(x):x1.append(x[i][0])x2.append(x[i][1])i += 1i = 0
plt.figure(1)
plt.subplot(121)
plt.title('linear regression')
while i < len(x1):if y[i] == 0:plt.scatter(x1[i],x2[i],color = 'r')elif y[i] == 1:plt.scatter(x1[i],x2[i],color = 'g')i += 1
a = -(w[2][0]/w[1][0])
b = -(w[0][0]+w[2][0])/w[1][0]
plt.plot([0,1],[a,b])

三、对数几率回归(Logistic Regression)

对数几率回归实质上使用Sigmoid函数对线性回归的结果进行了一次非线形的转换,Sigmoid函数如下

这里写图片描述

将线性模型带入可得

这里写图片描述

该式实际上是在用线性回归模型的预测结果去逼近真实标记的对数几率,因此,其对应的模型称为“对数几率回归”(logistic regression),将上式取常用对数,可转化为

这里写图片描述

现在我们开始对wb进行估计,将上式中的y视为类后验概率估计

这里写图片描述

则可以将模型转化为

这里写图片描述

显然有

这里写图片描述
这里写图片描述

到这里,我们便可以使用“极大似然法”(maximum likelihood method)来估计wb,给定数据集如下

这里写图片描述

对率回归模型最大化“对数似然”,记为式 1

这里写图片描述

即令每个样本属于其真实标记的概率越大越好,现令

这里写图片描述

再令

这里写图片描述

此时,便可将之前式1里的似然项改写为

这里写图片描述

由此可知,式1等于

这里写图片描述

这是一个高阶可导连续凸函数,接下来给出牛顿法的推导公式,首先为
这里写图片描述设置任意值
设定允许误差,再代入下式循环求解求解

这里写图片描述

其中

这里写图片描述
这里写图片描述

基于上述理论,其python源码如下:

'''
2.Newton method figure out logistic regression
'''def logistic_regression(x,y,error,n):def preprocess(x,y):X = np.mat(x)b = np.mat([1]*len(x))X = np.hstack((X,b.T))w = [1]*(len(x[0])+1)W = np.mat(w).TY = yreturn X,W,Y   def func_p(X,W):a = (X*W).tolist()b = float(a[0][0])temp = np.exp(b)/(1+np.exp(b))return tempdef dfunc(X,Y,W):i,num,sum1 = 0,len(X),0while i < num:temp = Y[i] - func_p(X[i],W)sum1 += X[i]*tempi += 1return sum1*(-1)def d2func(X,Y,W):i,num,sum1 = 0,len(X),0while i < num:         temp = func_p(X[i],W)*(1 - func_p(X[i],W))sum1 += X[i]*(X[i].T)*tempi += 1sum1 = sum1.tolist()return float(sum1[0][0])def Newton(x,y,error,n):X,W,Y = preprocess(x,y)i = 1while i < n:d1 = dfunc(X,Y,W)a = (d1*d1.T).tolist()a = float(a[0][0])if a < error:return Wbreaktemp = dfunc(X,Y,W)W = W - temp.T*(d2func(X,Y,W)**(-1))i += 1if i == n:return 'error'w = Newton(x,y,error,n)X,W,Y = preprocess(x,y)yy = (X*w).tolist()w = w.tolist()return w,yy

测试代码如下


#visiable and output test           
w,yy = logistic_regression(x,y,0.0001,1000)i,x1,x2,z = 0,[],[],[]
while i < len(x):x1.append(x[i][0])x2.append(x[i][1])z.append(yy[i][0])i += 1i = 0plt.subplot(122)
plt.title('logistic regression')
while i < len(x1):if y[i] == 0:plt.scatter(x1[i],x2[i],color = 'r')elif y[i] == 1:plt.scatter(x1[i],x2[i],color = 'g')i += 1
a = -(w[2][0]/w[1][0])
b = -(w[0][0]+w[2][0])/w[1][0]
plt.plot([0,1],[a,b])

四、线性判别分析(Linear Discriminant Analysis)

线性判别分析是一种经典的线形学习方法,最早由费舍尔(Fisher)在二分类问题上提出,所以也称为“Fisher判别分析”
其思想非常朴素:给定训练样例集,设法将样例点投影到一条直线上,使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离;在对测试样例进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。这里只讲述二分类问题的原理和求解,给定数据集

这里写图片描述

再分别令

这里写图片描述

表示i(等于0或1)类示例的集合、均值向量、协方差矩阵,将数据投影到直线w上,则两类样本的中心在直线上的投影分别为

这里写图片描述

若将所有样本点都投影到直线上,则两类样本的协方差分别为

这里写图片描述

想要使同类样例的投影点尽可能接近,可以让同类样例的协方差尽可能小,即

这里写图片描述

尽可能小;同时,也想要让异类样例的投影点尽可能远离,可以让类中心之间的距离尽可能大,即

这里写图片描述

尽可能的大,则可以定义最大化目标

这里写图片描述

定义类内散度矩阵(within class scatter matrix)

这里写图片描述

以及类间散度矩阵(between class)

这里写图片描述

可将最大化目标重写为

这里写图片描述

由拉格朗日乘法子可从上式求出

这里写图片描述

由此可解出二分类问题的LDA模型,基于上述理论,其python源码如下:

'''
3.Linear Discriminant Analysis for binary classification problem
'''def LDA(x,y):def preprocess(x,y):i = 0X0,X1 = [],[]while i < len(y):if y[i] == 0:X0.append(x[i])elif y[i] == 1:X1.append(x[i])i += 1return X0,X1def average(X):X = np.mat(X)i = 1while i < len(X):X[0] = X[0] + X[i]i += 1res = X[0]/ireturn resdef Sw(X0,X1,u0,u1):X_0 = np.mat(X0)X_1 = np.mat(X1)Sw0,i = 0,0temp0 = (X_0 - u0).T*((X_0 - u0))
#        while i < len(temp0):
#            Sw0 += float(temp0[i,i])
#            i += 1
#        Sw1,i = 0,0temp1 = (X_1 - u1).T*((X_1 - u1))
#        while i < len(temp1):
#            Sw1 += float(temp1[i,i])
#            i += 1
#        return Sw0+Sw1return temp0 + temp1X0,X1 = preprocess(x,y)u0,u1 = average(X0),average(X1)SW = Sw(X0,X1,u0,u1)return (SW**(-1)*numpy.mat(u0-u1).T).tolist()   #visiable and output test           
W = LDA(x,y)i,x1,x2,z = 0,[],[],[]
while i < len(x):x1.append(x[i][0])x2.append(x[i][1])i += 1
i = 0
plt.figure(2)
plt.subplot(121)
plt.title('LDA')
while i < len(x1):if y[i] == 0:plt.scatter(x1[i],x2[i],color = 'r')elif y[i] == 1:plt.scatter(x1[i],x2[i],color = 'g')i += 1
print(W)plt.plot([0,-W[0][0]],[0,-W[1][0]])

五、三个模型结果对比图

完整代码地址:https://github.com/LiangjunFeng/Machine-Learning/blob/master/1.linear_model.py

这里写图片描述

六、更多资源下载

微信搜索“老和山算法指南”获取更多下载链接与技术交流群
在这里插入图片描述
有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。


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

相关文章

机器学习(二)线性模型——线性回归、对数几率回归、线性判别分析

一、线性回归 线性回归&#xff08;linear regression&#xff1a;试图学得一个线性模型以尽可能准确地预测实值输出标记。 1.最简单的形式&#xff1a;输入属性的数且只有一个&#xff0c; 最小二乘法&#xff1a;基于均方差误差最小化来进行模型的求解&#xff0c;在线性回…

对数线性模型:逻辑斯谛回归和最大熵模型

http://blog.csdn.net/pipisorry/article/details/52788947 对数线性模型log linear model 对数线性模型有&#xff1a;最大熵模型和逻辑斯谛回归。 特征和指示特征 对数线性模型的一般形式 [概率图模型原理与技术] 某小皮 对数线性模型的不同形式 因子图 将因子转换到对…

从线性到非线性模型-对数线性模型

从线性到非线性模型 1、线性回归&#xff0c;岭回归&#xff0c;Lasso回归&#xff0c;局部加权线性回归 2、logistic回归&#xff0c;softmax回归&#xff0c;最大熵模型 3、广义线性模型 4、Fisher线性判别和线性感知机 5、三层神经网络 6、支持向量机 code: https://…

论文总结3 对数线性模型 罗盛

研究变量之间的相互关系、列联表、对应分析 目录 一、模型介绍 二、比较-对数线性模型&对应分析 1.相同&不同 2.相互关系 三、应用实例 1.模型确立 2.列因素&因子负荷 四、总结经验 一、模型介绍 列联表分析无法系统地评价变量间的联系&#xff0c;无法…

对数线性模型之一(逻辑回归), 广义线性模型学习总结

经典线性模型自变量的线性预测就是因变量的估计值。 广义线性模型:自变量的线性预测的函数是因变量的估计值。常见的广义线性模型有:probit模型、poisson模型、对数线性模型等等。对数线性模型里有:logistic regression、Maxinum entropy。本篇是对逻辑回归的学习总结,以及…

机器学习篇——对数线性模型

建议首先看cs229讲的广义线性模型、exponential family&#xff08;指数分布族&#xff09; 对数线性模型包括逻辑回归、最大熵模型和条件随机场等 1、模型 条件概率分布&#xff08;对数线性模型、概率模型&#xff09;、判别模型 逻辑回归&#xff1a; 概率分布可由广…

对数线性模型(Logistic回归算法)

1.Logistic分布&#xff1a; logistic分布定义&#xff1a;设X是连续随机变量&#xff0c;X服从logistic分布&#xff0c;即为X具有下列分布函数和密度函数&#xff1a; 其中&#xff0c;mu为位置参数&#xff0c;r>0为形状参数&#xff1b; logistic分布的分布函数F(x)的…

Log-Linear Models

一&#xff0c;简介 引入 对数线性模型被广泛应用于NLP中&#xff0c;对数线性模型的一个关键优点在于它的灵活性&#xff1a;它允许非常丰富的特征集合被用于模型中。常见的对数线性模型有Logistic回归、最大熵模型、MEMMs和CRFs等。 目的 1&#xff0c;Trigram LM Trigr…

Android getText(int resId)和getString(int resId)

Android提供多种获取资源文件方法&#xff0c;但是需要注意以下方法&#xff1a; CharSequence getText(int resId)&#xff1a;返回本地、样式化的字符。 String getString(int resId) &#xff1a;返回字符串 比如&#xff1a; String.xml文件中定义资源文件&#xff1a; <…

Resid

关于Resid服务器闪退问题&#xff0c;导致客户端&#xff1a;Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝无法连接解决方案。 前言&#xff1a;最近在整理计算机文档时发现过去学习过程中自己出现bug和解决办法&#xff0c;就整理一下发到个人博客…

redis05-Resid数据类型综合实践案例

Resid数据类型综合实践案例 业务场景 1.计数器 解决方案 设计计数器&#xff0c;记录调用次数&#xff0c;用于控制业务执行次数。以用户id作为key,使用此时作为value在调用前获取次数&#xff0c;判断是否超过限定次数&#xff0c;不超过次数的情况下&#xff0c;每次调用计…

ResDrawableImgUtil【根据图片名称获取resID值或者Bitmap对象】

版权声明&#xff1a;本文为HaiyuKing原创文章&#xff0c;转载请注明出处&#xff01; 前言 根据图片名称获取项目的res/drawable-xxdhpi中相应资源的ID值以及bitmap值的封装类。 效果图 代码分析 根据图片名称获取图片的resID值有两个方案&#xff0c;选其一即可。 使用步骤 …

Android - Context中的getText(int resId)方法和getString(int resId)方法的区别

Android开发中&#xff0c;经常在Activity中使用getText(int resId)和getString(int resId)这两个方法&#xff0c;那么这两个方法有什么区别和联系呢&#xff1f; 这两个方法的参数都是资源ID&#xff0c;区别在于getText(int resId)返回的是一个CharSequence&#xff0c;而ge…

Resources类中getString (int ResID)与getText (int ResID)的区别

Resources类中getString (int ResID)与getText (int ResID)的区别 getString (int ResID)和getText (int ResID)都是Resources类中方法&#xff0c;都是获取资源文件中的字符串资料。 getString (int ResID)&#xff1a;是获得资源文件的字符串资源&#xff08;XML文件中Strin…

【Redis】5. Resid数据类型综合实践案例

Resid数据类型综合实践案例 业务场景 1.计数器 解决方案 设计计数器&#xff0c;记录调用次数&#xff0c;用于控制业务执行次数。以用户id作为key,使用此时作为value在调用前获取次数&#xff0c;判断是否超过限定次数&#xff0c;不超过次数的情况下&#xff0c;每次调用计…

springboot打成jar后获取resources下文件失败, cannot be resolved to absolute file path because it does not resid

读取resources下的文件quotaShow.jasper 本地开发环境能正常下载&#xff1a; ClassPathResource resource new ClassPathResource("jasper" File.separator "quotaShow.jasper"); reportFile resource.getFile(); 打jar包发布至linux服务器时报错&am…

Resid作为缓存可能遇到的问题

1.缓存的执行流程 前台请求&#xff0c;后台先从缓存中取数据&#xff0c;取到直接返回结果&#xff0c;取不到时从数据库中取&#xff0c;数据库取到更新缓存&#xff0c;并返回结果&#xff0c;数据库也没取到&#xff0c;那直接返回空结果。 [外链图片转存失败,源站可能有…

动态修改android中的资源索引resId

目录 一、引言 1、为什么要动态修改资源索引 2、怎么修改资源索引 3、什么时候修改 二、处理Task及R文件 1、处理Task 2、修改R文件 三、处理编译后的二进制文件 1、编译后的文件在哪&#xff1f; 2、解压、压缩AP_文件 3、修改resources.arsc文件的pkgId 4、修改Xm…

Redis安装(Windows环境)

文章目录 一、Resid简介&#xff1a;二、下载Redis三、启动Redis服务四、设置Windows服务五、常用的Redis服务命令六、cmd启动服务&#xff1a;七、操作测试Redis 一、Resid简介&#xff1a; Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分…

Resid总结

Redis是什么&#xff1f; Redis&#xff1a;REmote DIctionary Server(远程字典服务器&#xff09; 是完全开源免费的&#xff0c;用C语言编写的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的(key/value)分布式内存数据库&#xff0c;基于内存运行并支持持久化的NoSQL数…