文章目录
- 第一章 贝叶斯决策理论(正态分布下的贝叶斯)概率密度估计
- 作业及代码
- 第四课 感知机
- 5.14 作业,线性分割,计算最短的
- 5.19线性可分SVM(hard)、线性SVM(soft)、都加核函数为非线性svm
16课时,内容参考
本课程较全面、系统地介绍模式识别的的基本理论、原理方法和应用,重点需要学生掌握
- 贝叶斯决策理论、
- 概率密度函数的估计、
- 线性分类函数:回归、线性可分svm、感知机
- 非线性分类函数:svm、核函数svm,多层感知机神经网路(次要、分段线性判别、二次判别函数)
- 近邻法、
- 特征的选择与提取、
- 基于K-L展开式的特征提取、
- 非监督学习方法、
- 人工神经网络、
- 模糊模式识别方法、
- 统计学习理论比如支持向量机等。
第一章 贝叶斯决策理论(正态分布下的贝叶斯)概率密度估计
其中 是假设样本服从指数族分布的(两点、高斯)模型参数,每一类进行
估计
解读贝叶斯,理解先验和后验概率
作业及代码
import glob
import cv2
import numpy as np
import time
start= time.time()
#---------------------------1 读取数据拉成一行,append到列表------------------------------------
w=112
size=(w,w)
#img_list[4][arry],4是类别
img_list=[list() for i in range(10)]
sum_data=0
for i in range(10):
img_list_tmp=glob.glob('./train/'+str(i)+'/*.bmp')
print('样本数字{}的个数{}'.format(i,len(img_list_tmp)))
for path in img_list_tmp:
img=cv2.imread(path,0)
img=cv2.resize(img,size)
# cv2.imshow('resize',img)
# cv2.waitKey(0)
cv_img = img.astype(np.uint8)
cv2.threshold(cv_img, 50, 1, cv2.THRESH_BINARY_INV, cv_img)
vector=cv_img.reshape(-1)
# print((len(vector)))
img_list[i].append(vector)
sum_data=sum_data+len(img_list_tmp)
#---------------------------2 计算先验概率和类条件概率,append到列表里---------------------------------
#计算先验
prior_prob=[]
for i in range(10):
prior_prob.append(len(img_list[i])/sum_data)
print(prior_prob)
#计算条件类概率
condition_prob=[list([list([list() for j in range(len(vector))]) for i in range(10)]) for c in range(2)]
#统计各列X0/1,且标签=0...9,
for i in range(2):
#y类别
for j in range(10):
print(j)
#所有x的该维度的
for k in range(len(vector)):
# 样本数,所有标签为j的且维度为k,且数值=i的数量
count=0
for x in range(126):
if img_list[j][x][k]==i:
count=count+1
condition_prob[i][j][k]=np.log((count+1)/(len(img_list[j])+2)) #拉普拉斯平滑,并且取对数,后面的连乘,变成加
print(condition_prob[i][j])
#---------------------------3 预测:计算后验概率,正正确率------------------------------------------
##预测,计算10个类别的各个概率,每次是连乘法转换成加法
def predict(vector_test):
post_prob=[list() for i in range(10)]
for i in range(10):
pai=0
lenth=0
for j in vector_test:
pai=pai+condition_prob[int(j)][i][lenth]
lenth+=1
# post_prob[i]=prior_prob[i]*pai
#因为所有的先验概率都是0.1,这不用再做乘法
post_prob[i] = pai
# print(post_prob)
predict_lable=post_prob.index(max(post_prob))
# print(predict)
return predict_lable
rightcount_per_class=[]
rightness_per_class=[]
for c in range(10):
right_num=0
for vector_test in img_list[c]:
#进行预测和判断是否为正确预测,
predict_lable=predict(vector_test)
if predict_lable==c:
right_num+=1
rightcount_per_class.append(right_num)
rightness_per_class.append(right_num/126)
print('各类别正确数',rightcount_per_class)
print('各类别正确率',rightness_per_class)
print('总正确数',sum(rightcount_per_class))
print('总正确率',sum(rightcount_per_class)/1260)
print('vectorsize',size)
print('花费时间',time.time()-start)
第四课 感知机
5.14 作业,线性分割,计算最短的
5.19线性可分SVM(hard)、线性SVM(soft)、都加核函数为非线性svm