山东大学 机器学习 实验报告 实验1 模式分类 上机练习

 

作业:P64,2.5节,4:

 

考虑上机题2中的3个类别,设p(wi)=1/3

(a)以下各测试点与上机练习2中各类别均值间的Mahalanobis距离分别是多少:
(121)t,(532)t,(000)t,(100)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):
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值