在一个机器学习任务中,如果每一条数据的目标值是离散的,则该任务是一个分类任务。
解决分类问题基本的方法有:线性分类器、决策树、朴素贝叶斯、人工神经网络、K近邻(KNN)、支持向量机(SVM);
组合基本分类器的集成学习算法:随机森林、Adaboost、Xgboost等。
一、线性分类器
线性分类器=假设函数+损失函数,假设函数是原始图像数据到类别的映射;
使用线性分类器分类的问题可以转化为最优化问题:通过更新假设函数的参数值来最小化损失函数的值,从而找到最优解。
在线性分类器中,输出是输入的加权和。
常用的线性分类器有:基本线性分类器、最小二乘线性分类器、感知器、逻辑回归分类器。
1.基本线性分类器
原理:
(1)计算目标值为1的所有正例数据的重心和目标值为0的所有负例数据的重心。
(2)计算与正例重心与负例重心距离相等的超平面。
过程:
(1)对训练集中目标值为1的正例逐个属性求均值,得到正例重心;对训练集中目标值为0的负例逐属性求均值,得到负例重心。
(2)正例重心和负例重心相减得到权重向量。
(3)将正例重心和负例重心相加除以2得到中点C。
(4)将T=作为分类阈值。对测试集的每个样本x与权重做点乘,若大于T,则分为1;否则分为0。
python代码:
#1.基本线性分类器
class BaseLinearClassifier:
def __init__(self,w=np.zeros((20,1))):
#私有属性不允许继承
self.weight=w
#查看权重系数
@property
def get_weight(self):
return self.weight
#训练函数
def fit(self,xtrain,ytrain):
#得到正例索引
index1=np.where(ytrain==1)
#得到正例重心
#axis=0表示“压缩行”,对各列求均值,最终得到1*n矩阵。
pos_centriod=np.mean(xtrain[index1[0]],axis=0)
#得到负例索引
index2=np.where(ytrain==0)
#得到负例重心
neg_centriod=np.mean(xtrain[index2[0]],axis=0)
#得到权重向量
self.weight=pos_centriod-neg_centriod
#计算阈值
T=np.dot(self.weight,1/2*(pos_centriod+neg_centriod))
return T
#准确率测试
def score(self,xtest,ytest,threshold):
#测试集预测的类别
predict=[]
for i in xtest:
#若大于阈值,则返回类别1
if np.dot(i,self.weight)>=threshold:
predict.append(1)
#若小于阈值,