作业:P64,2.5节,4:
考虑上机题2中的3个类别,设p(wi)=1/3 (a)以下各测试点与上机练习2中各类别均值间的Mahalanobis距离分别是多少: (1,2,1)t,(5,3,2)t,(0,0,0)t,(1,0,0)t (b)对以上各点进行分类。 (c)若设p(w1)=0.8,p(w2)=p(w3)=0.1,再对以上测试点进行分类。
这道题的思路完全与P35的例1一样,所以会做例1,这道题就会做了。
我以以例题1的数据,测试了[0,0],[3,8]分类正确。
另外,我不会python的= =,然后,我做完后才知道可以用java(╬▔皿▔)凸,这代码是憋出来的,至今为止依然不会用自带的矩阵乘法、转置balabala,只能自己实现……。
这两道题花了我二天半的时间(中途心态崩溃导致买买买导致错过deadline,我正在写博客的现在……qwq还在等老师的联系方式……老天保佑)。
事实证明,如果只为了赶快交作业的话,就算你没去上课,你也不用看书。 去做例1把,那里什么都有,如果遇到不懂的,就顺着它的思路往前去找,比如说书才买的我,看不懂例1,就从第二章开始找u、sigma的定义,再盲猜例1中u、sigma的计算方式,才看懂例1。
(最新补充,我发现了,协方差矩阵的算法在P72第二行,注意x、u均为列向量)
(a):
1、用式(40)计算出均值向量
2、用式(41)计算出协方差矩阵,
3、遍历测试点和样本数据
4、实现并获得(x-u)、(x-u).T
5、代入sqrt( (x-μ)'Σ^(-1)(x-μ) ) 计算Mahalanobis距离
(b):
1、输入样本数据,得到u、sigma矩阵
2、遍历测试点,对每个测试点,计算其分别属于类i的判别函数值,选出最大的,判定为类i(判别函数方程对应《模式分类第二版》P32 (66)~(69))
(注意样本数据和测试数据的格式和书上保持一直)
1 # a.py 2 import numpy 3 4 5 # 输入:x0[i]第i个测试点,x[i]第i个样本数据,group类总数,len0维度(描述一个类的元素总数) 6 # 输出:dis[i][j]表示第i个测试点和第j个类的均值向量的距离 7 def mahalanobis(x0, x, group, len0): 8 dis = list() 9 u = getU(x, group, len0) 10 11 for i in range(len(x0)): 12 xx = numpy.array(x0[i]) 13 sigma = getSigma(x, group, len0) 14 dis.append([]) 15 for j in range(len(u)): 16 u[j] = numpy.array(u[j]) 17 18 # sqrt( (x-μ)'Σ^(-1)(x-μ) ) 计算Mahalanobis距离 19 t = [xx - u[j]] 20 t1 = myMult(t, numpy.linalg.inv(sigma[j])) 21 t2 = myMult(t1, rowToCol(xx - u[j])) 22 23 dis[i].append(t2[0][0]) 24 25 return dis 26 27 28 # 输入:(同上) 29 # 输出:u[i]是类i的均值向量 30 def getU(x, group, len0): 31 u = list() 32 for i in range(group): 33 t = list() 34 for j in range(len(x)): 35 t.append([]) 36 for z in range(i * len0, i * len0 + len0): 37 t[j].append(x[j][z]) 38 u.append(numpy.mean(t, 0)) 39 return u 40 41 42 # 输入:(同上) 43 # 输出:返回值sigma[i]表示第i类的协方差矩阵 44 def getSigma(x, group, len0): 45 sigma = list() 46 u = getU(x, group, len0) 47 48 for i in range(group):