3.1 试析在什么情形下式 (3.2) 中不必考虑偏置项 b.
1、训练样本中存在属性为固定值(常量),wxi等价于偏置项b
2、分析属性值的变动对标志值的影响程度时,不用考虑b
3、当训练的样本集为原样本集中每个样本与任意一个样本之差时,不用考虑b
4、根据
得到当所有标志值之和等于所有加权属性值之和时,偏置项b等于0
5、当所有属性值为零时标志值为零,则偏置项b等于0
3.2 试证明,对于参数 ω,对率团归的目标函数 (3.18)是非凸的,但其对数 似然函数(3.27)是凸的.
3.3 编程实现对率回归,并给出西瓜数据集 3.0α 上的结果.
(相关资料显示二范数误差应小于0.0000001才能确定牛顿迭代最终解,但由于Spyder卡顿,所以暂时放宽为0.0001了)
import numpy as np
X = np.mat([[0.697,0.460,1],[0.556,0.215,1],[0.774,0.376,1],
[0.634,0.264,1],[0.481,0.149,1],[0.608,0.318,1],[0.403,0.237,1],
[0.666,0.091,1],[0.437,0.211,1],[0.243,0.267,1],
[0.245,0.057,1],[0.343,0.099,1],
[0.639,0.161,1],[0.657,0.198,1],[0.360,0.370,1],
[0.593,0.042,1],[0.719,0.103,1]]) #增加一个恒定属性值为1的 属性用来得到偏移量
Y = np.array([1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0])
beta = np.random.rand(3,1) #随机生成初始β值
def getP1(X,beta): #得到p1
m,n = X.shape
P1 = []
for i in range(m):
P1.append((np.e ** np.dot(X[i],beta)[0,0])/(1+np.e ** np.dot(X[i],beta)[0,0])) #因dot结果还是一个矩阵mat,所以要将其转成一个标量数值,用[0,0]
return np.array(P1)
def getDbeta(X,Y,beta): #一阶导数
P1 = getP1(X,beta)
m,n = X.shape
Dbeta = np.zeros((3,1))
for i in range(m):
Dbeta += X[i].T*(Y[i]-P1[i])
return -Dbeta
def getD2beta(X,beta): #二阶导数
P1 = getP1(X,beta)
m,n = X.shape
D2beta = np.zeros((3,3))
for i in range(m):
D2beta += np.dot(X[i].T,X[i])*P1[i]*(1-P1[i])
return np.mat(D2beta)
while np.linalg.norm(-np.dot(getD2beta(X,beta).I,getDbeta(X,Y,beta)))>0.0001:
#如果新的beta值与之前的beta值差距(用二范数判断)大于0.0001则继续牛顿迭代
beta1=beta-np.dot(getD2beta(X,beta).I,getDbeta(X,Y,beta))#书上的牛顿迭代公式
beta=beta1
print(beta)#小于则输出最终结果
图中为求出的参数w1,w2,b
3.5 编辑实现线性判别分析,并给出西瓜数据集 3.0α 上的结果.
import numpy as np
import matplotlib.pyplot as plt
X0 = np.array([[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]]) # 第一类数据
X1 = np.array([[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]]) # 第二类数据
u0 = np.mean(X0,axis=0,keepdims=True) # u0 第一类向量均值
u1 = np.mean(X1,axis=0,keepdims=True) # u1 第二类向量均值
Sw = (X0-u0).T.dot(X0-u0) + (X1-u1).T.dot(X1-u1) #类内散度矩阵公式
w = np.linalg.inv(Sw).dot((u0-u1).T)#w=sw**-1(u0-u1)
print(w)
print("y={}x".format(w))
图中为求出的参数w和投影直线
3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对 率回归的错误率.
修改多次仍报错,这部分之后再补了。
放一个详细说明如何使用uci数据集的链接 https://blog.csdn.net/qq_32892383/article/details/82225663
3.6 线性判别分析仅在线性可分数据上能获得理想结果?试设计一个改进 方法,使其能较好地用于非线性可分数据
1、高维映射后再投影到直线上
2、参考支持向量机的核方法高维映射,通过改变样本属性的维度将样本集投射到一个更高维的空间内进行线性划分,并且用核函数直接得到高维特征空间中样本的内积。
3、参考在神经网络中使用多层功能神经元,在输出层和输入层之间增加一层隐含层(输入层经过第一次激活函数加工并通过阈值分类之后再一次函数加工并通过阈值分类),考虑是否可以二次投影。
令码长为 9,类别数为 4,试给出海明距离意义下理论最优的 ECOC 二元码井证明之.
海明距离,两个编码对应位上编码不同的位数,多个编码的海明距离意义下的最优码为任意两个编码海明距离最大,我理解为每两组编码的海明距离的积最大。
每一列的分类结果为两个正例两个反例时,编码不相同的组数最多为四组,所以只要一个分类器下四个类别的的分类结果为两正两负时,所有不同编码的组数之和为36,所以当海明距离为6 6 6 6 6 6时,积最大,所以前三个编码可以是
当最后一个编码全为0时,可实现任意两个编码的海明距离为6,但考虑实际某类的编码不能全为0,不然则没有对这类有划分意义的分类器,所以将任意一位改为一。
3.8* ECOC 编码能起到理想纠错作用的重要条件是:在每一位编码上出错 的概率相当且独立.试析多分类任务经 ECOC 编码后产生的二类分 类器满足该条件的可能性及由此产生的影响.
类别之间的差异越相同,分类器会将测试样例判断为与测试样例特征相似的类别所被判断为的结果,所以当类别之间的特征越相似,出错的概率越大,即出错概率和类别之间的差异程度有关,每一位编码出错概率 大约正相关于测试样例类别和与其相似的类别的差异程度,所以当每个类别的差异程度相当时,出错概率相当的可能性越大。
影响 在此基础上才能再理论上产生理想的纠错作用,另一方面,并不是编码的理论性质越好,分类性能就越好,因为机器学习问题涉及很多因素,例如将多个类拆解为两个"类别子集 式所形成的两个类别子集的区分难度往往不同即其导致的二分类问题的难度不同;于是一个理论纠错性质很好,导致的三分类问题较难的编码,与另一 个理论纠错性质差一些、但导致的二分类问题较简单的编码,最终产生的模型 性能孰强孰弱很难说
3.9 使用 OvR 和 MvM 将多分类任务分解为二分类任务求解时,试述为何 无需专门针对类别不平衡性进行处理.
对 OvR、MvM 来说,由于对每个类进行了相同的处理,
拆解出的二分类任务中类别不平衡的影响会相互抵消,所以无需专门处理。