热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分类与聚类

一:分类1:定义分类其实是从特定的数据中挖掘模式,做出判断的过程。分类是在一群已经知道类别标号的样本中,训练一种分类器

一:分类


1:定义

分类其实是从特定的数据中挖掘模式,做出判断的过程。

分类是在一群已经知道类别标号的样本中,训练一种分类器,让其能够对某种未知的样本进行分类。分类算法属于一种有监督的学习。分类算法的分类过程就是建立一种分类模型来描述预定的数据集或概念集,通过分析由属性描述的数据库元组来构造模型。分类的目的就是使用分类对新的数据集进行划分,其主要涉及分类规则的准确性、过拟合、矛盾划分的取舍等。


2:分类学习主要过程:

(1):训练数据及存在一个类标记号,判断他是正向数据集(起积极作用,不垃圾邮件),还是负向数据集(其抑制作用,垃圾邮件)

(2):然后需要对数据集进行学习训练,并构建一个训练的模型

(3):通过该模型对预测数据集进行预测,并计算其结果的性能


3:常用的分类算法包括:

NBC(Naive Bayesian Classifier,朴素贝叶斯分类)算法、LR(Logistic Regress,逻辑回归)算法、ID3(Iterative Dichotomiser 3 迭代二叉树3 代)决策树算法、C4.5 决策树算法、C5.0 决策树算法、SVM(Support Vector Machine,支持向量机)算法、KNN(K-Nearest Neighbor,K 最近邻近)算法、ANN(Artificial Neural Network,人工神经网络)算法等。

(1)NBC算法
NBC 模型发源于古典数学理论,有着坚实的数学基础。该算法是基于条件独立性假设的一种算法,当条件独立性假设成立时,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。
NBC算法的优点:

NBC算法逻辑简单,易于实现;
NBC算法所需估计的参数很少;
NBC 算法对缺失数据不太敏感;
NBC 算法具有较小的误差分类率;
NBC 算法性能稳定,健壮性比较好;


NBC算法的缺点:
1.在属性个数比较多或者属性之间相关性较大时,NBC 模型的分类效果相对较差;
2.算法是基于条件独立性假设的,在实际应用中很难成立,故会影响分类效果

(2)LR算法
LR 回归是当前业界比较常用的机器学习方法,用于估计某种事物的可能性。它与多元线性回归同属一个家族,即广义线性模型。简单来说多元线性回归是直接将特征值和其对应的概率进行相乘得到一个结果,逻辑回归则是在这样的结果上加上一个逻辑函数。在此选择LR 作为回归分析模型的代表进行介绍。
LR算法的优点
1.对数据中小噪声的鲁棒性好;
2.LR 算法已被广泛应用于工业问题中;
3.多重共线性并不是问题,它可结合正则化来解决。

LR算法的缺点
1.对于非线性特征,需要转换
2.当特征空间很大时,LR的性能并不是太好

(3)SVM算法(比较常用的)
SVM 算法是建立在统计学习理论基础上的机器学习方法,为十大数据挖掘算法之一。通过学习算法,SVM 可以自动寻找出对分类有较好区分能力的支持向量,由此构造出的分类器可以最大化类与类的间隔,因而有较好的适应能力和较高的分准率。SVM 算法的目的在于寻找一个超平面H,该超平面可以将训练集中的数据分开,且与类域边界的沿垂直于该超平面方向的距离最大,故SVM 法亦被称为最大边缘算法。

SVM算法的优点
1.SVM 模型有很高的分准率;
2. SVM 模型有很高的泛化性能;
3. SVM 模型能很好地解决高维问题;
4. SVM 模型对小样本情况下的机器学习问题效果好。

SVM算法的缺点
1.SVM 模型对缺失数据敏感;
2.对非线性问题没有通用解决方案,得谨慎选择核函数来处理。

(4)ID3算法
ID3 算法是一种基于决策树的分类算法,该算法是以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。信息增益用于度量某个属性对样本集合分类的好坏程度。ID3 算法的时间复杂度为O(n*|D|*log|D|)。

ID3算法的优点

ID3 算法建立的决策树规模比较小;
查询速度快。
ID3算法的缺点
1.不适合处理连续数据;
2.难以处理海量数据集;
3.建树时偏选属性值较大的进行分离,而有时属性值较大的不一定能反应更多的数据信息。

(5)C4.5 算法
C4.5 算法是ID3 算法的修订版,采用信息增益率来加以改进,选取有最大增益率的分割变量作为准则,避免ID3 算法过度的适配问题。

C4.5算法优点
1.C4.5 继承了ID3 优点;
2.在树构造过程中进行剪枝;
3.能对不完整数据进行处理;
4.能够完成对连续属性的离散化处理;
5.产生的分类规则易于理解,准确率较高;
6.用增益率来选择属性,克服了用增益选择属性时偏向选择取值多的属性。

C4.5 算法缺点
1.构造树时,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效;
2.只适合于能驻留于内存的数据集,当训练集达到内存无法容纳时程序无法运行。

C4.5 用于遥感分类过程中,首先依据通常的方式建立第一个模型。随后建立的第二个模型聚焦于被第一个模型错误分类的记录。以此类推,最后应用整个模型集对样本进行分类,使用加权投票过程把分散的预测合并成综合预测。Boosting 技术对于噪声不大的数据,通常通过建立的多模型来减少错误分类的影响,提高分类精度。

(5)C5.0算法
C5.0 算法是 Quinlan 在C4.5 算法的基础上改进而来的产生决策树的一种更新的算法,它除了包括C4.5 的全部功能外,还引入许多新的技术,其中最重要的技术是提升(Boosting)技术,目的是为了进一步提高决策树对样本的识别率。同时C5.0 的算法复杂度要更低,使用更简单,适应性更强,因此具有更高的使用价值。

C5.0算法的优点
1.C5.0 模型能同时处理连续和离散的数据
2.C5.0 模型估计
模型通常不需要很长的训练时间;
3.C5.0 引入Boosting 技术以提高分类的效率和精度;
4.C5.0 模型易于理解,模型推出的规则有非常直观的解释;
5.C5.0 模型在面对数据遗漏和特征很多的问题时非常稳健。

C5.0算法的缺点
目标字段必须为分类字段。

美国地质调查局(USGS)在进行土地覆盖分类项目过程中研发了支持决策树分类的软件。软件分类模块主要是针对庞大数据量的数据集进行数据挖掘,找出特征,然后建立规则集进行决策分类。在分类模块中采用C5.0 模型来完成决策树分类、形成分类文件,实现遥感影像的分类。

(6)KNN 算法
KNN 算法是Cover 和Hart 于1968 年提出的理论上比较成熟的方法,为十大挖掘算法之一。该算法的思路非常简单直观:如果一个样本在特征空间中的k 个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

KNN算法的优点
1.KNN 算法简单、有效;
2.KNN 算法适用于样本容量比较大的类域的自动分类;
3.由于KNN 方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN 方法较其他方法更为适合。

KNN算法的缺点
1.KNN 算法计算量较大;
2.KNN 算法需要事先确定K 值;
3.KNN 算法输出的可解释不强;
4. KNN 算法对样本容量较小的类域很容易产生误分。

(7)ANN 算法
人工神经网络(ANN)算法就是一组连续的输入/输出单元,其中每个连接都与一个权相关。在学习阶段,通过调整神经网络的权,使得能够预测样本的正确类标号来学习。

ANN算法的优点
1.能处理数值型及分类型的属性;
2.分类的准确度高,分布并行处理能力强;
3.对包含大量噪声数据的数据集有较强的鲁棒性和容错能力。

ANN算法的缺点
1.不能观察之间的学习过程;
2.学习时间过长,甚至可能达不到学习的目的;
3.对于非数值型数据需要做大量数据预处理工作;
4.输出结果难以解释,会影响到结果的可信度和可接受程度;
5.神经网络需要大量的参数,如网络拓扑结构、权值和阈值的初始值。

小结:

参考:参考1


二:聚类

1:定义

从广义上说,聚类就是将数据集中在某些方面相似的数据成员放在一起。

一个聚类就是一些数据实例的集合,其中处于相同聚类中的数据元素彼此相似,但是处于不同居类中的元素彼此不同。

由于在聚类中那些数据类别的分类或分组信息是没有的,即这些数据是没有标签的,所以聚类通常被称为无监督学习。

聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象分组。目的是,组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的)。组内相似性越大,组间差距越大,说明聚类效果越好。
也就是说, 聚类的目标是得到较高的簇内相似度和较低的簇间相似度,使得簇间的距离尽可能大,簇内样本与簇中心的距离尽可能小
聚类之后的数据,只能显示出这一类之间的数据有相似性,并不能说明其他问题

参考链接:这篇文章讲解聚类很全

 

2:K-means聚类

k均值聚类是最常用的聚类算法,最初起源于信号处理,其目标是将数据点划分为K个类簇,找到每个簇的中心并使其亮度最小化。

该算法的最大优点是简单、便于理解,运行速度较快,缺点是只能应用于连续性数据,并且要在聚类前指定聚类的类簇数。

K均值算法是一种原型聚类算法。

 

步骤:

①六个随机样本点

在图像处理中,通过k均值聚类算法可以实现图像分割、图像聚类、图像识别等操作

我们通过k均值可以将这些像素点聚类成K个簇,然后使用每个簇内的质心点来替换簇内所有的像素点,这样就能实现在不改变分辨率的情况下量化压缩图像颜色,实现图像颜色层级分割。

3:K-means聚类与图像处理

优点:

①解决聚类问题的一种经典算法,简单快速

②对处理大数据集,该算法保持可伸缩性和高效率

③当结果簇是密集的,他的效果较好

缺点:

①在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用

②必须实现给出k(要生成的簇的数目),而且对处置敏感,对于不同的初始值,可能会导致不同的结果

③不适合于发现非凸形状的簇或者大小差别很大的簇

④对噪声和孤立点数据敏感

三:代码

1:灰度图

# coding: utf-8'''
在OpenCV中,Kmeans()函数原型如下所示:
retval, bestLabels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags[, centers])data表示聚类数据,最好是np.flloat32类型的N维点集K表示聚类类簇数bestLabels表示输出的整数数组,用于存储每个样本的聚类标签索引criteria表示算法终止条件,即最大迭代次数或所需精度。在某些迭代中,一旦每个簇中心的移动小于criteria.epsilon,算法就会停止attempts表示重复试验kmeans算法的次数,算法返回产生最佳紧凑性的标签flags表示初始中心的选择,两种方法是cv2.KMEANS_PP_CENTERS ;和cv2.KMEANS_RANDOM_CENTERScenters表示集群中心的输出矩阵,每个集群中心为一行数据
'''import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像灰度颜色
img = cv2.imread('lenna.png', 0)
print (img.shape)#获取图像高度、宽度
rows, cols = img.shape[:]#图像二维像素转换为一维
data = img.reshape((rows * cols, 1))
data = np.float32(data)#定义中心 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#设置标签
flags = cv2.KMEANS_RANDOM_CENTERS#K-Means聚类 聚集成4类
compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)#生成最终图像
dst = labels.reshape((img.shape[0], img.shape[1]))#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']#显示图像
titles = [u'原始图像', u'聚类图像']
images = [img, dst]
for i in range(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([])
plt.show()

2:数据

# coding=utf-8
from sklearn.cluster import KMeans"""
第一部分:数据集
X表示二维矩阵数据,篮球运动员比赛数据
总共20行,每行两列数据
第一列表示球员每分钟助攻数:assists_per_minute
第二列表示球员每分钟得分数:points_per_minute
"""
X = [[0.0888, 0.5885],[0.1399, 0.8291],[0.0747, 0.4974],[0.0983, 0.5772],[0.1276, 0.5703],[0.1671, 0.5835],[0.1306, 0.5276],[0.1061, 0.5523],[0.2446, 0.4007],[0.1670, 0.4770],[0.2485, 0.4313],[0.1227, 0.4909],[0.1240, 0.5668],[0.1461, 0.5113],[0.2315, 0.3788],[0.0494, 0.5590],[0.1107, 0.4799],[0.1121, 0.5735],[0.1007, 0.6318],[0.2567, 0.4326],[0.1956, 0.4280] ]#输出数据集
print (X)"""
第二部分:KMeans聚类
clf = KMeans(n_clusters=3) 表示类簇数为3,聚成3类数据,clf即赋值为KMeans
y_pred = clf.fit_predict(X) 载入数据集X,并且将聚类的结果赋值给y_pred
"""clf = KMeans(n_clusters=3)
y_pred = clf.fit_predict(X)#输出完整Kmeans函数,包括很多省略参数
print(clf)
#输出聚类预测结果
print("y_pred = ",y_pred)"""
第三部分:可视化绘图
"""import numpy as np
import matplotlib.pyplot as plt#获取数据集的第一列和第二列数据 使用for循环获取 n[0]表示X第一列
x = [n[0] for n in X]
print (x)
y = [n[1] for n in X]
print (y)'''
绘制散点图
参数:x横轴; y纵轴; c=y_pred聚类预测结果; marker类型:o表示圆点,*表示星型,x表示点;
'''
plt.scatter(x, y, c=y_pred, marker='x')#绘制标题
plt.title("Kmeans-Basketball Data")#绘制x轴和y轴坐标
plt.xlabel("assists_per_minute")
plt.ylabel("points_per_minute")#设置右上角图例
plt.legend(["A","B","C"])#显示图形
plt.show()

3:RGB 图像

# coding: utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像
img = cv2.imread('lenna.png')
print (img.shape)#图像二维像素转换为一维
data = img.reshape((-1,3))
data = np.float32(data)#定义中心 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#设置标签
flags = cv2.KMEANS_RANDOM_CENTERS#K-Means聚类 聚集成2类
compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags)#K-Means聚类 聚集成4类
compactness, labels4, centers4 = cv2.kmeans(data, 4, None, criteria, 10, flags)#K-Means聚类 聚集成8类
compactness, labels8, centers8 = cv2.kmeans(data, 8, None, criteria, 10, flags)#K-Means聚类 聚集成16类
compactness, labels16, centers16 = cv2.kmeans(data, 16, None, criteria, 10, flags)#K-Means聚类 聚集成64类
compactness, labels64, centers64 = cv2.kmeans(data, 64, None, criteria, 10, flags)#图像转换回uint8二维类型
centers2 = np.uint8(centers2)
res = centers2[labels2.flatten()]
dst2 = res.reshape((img.shape))centers4 = np.uint8(centers4)
res = centers4[labels4.flatten()]
dst4 = res.reshape((img.shape))centers8 = np.uint8(centers8)
res = centers8[labels8.flatten()]
dst8 = res.reshape((img.shape))centers16 = np.uint8(centers16)
res = centers16[labels16.flatten()]
dst16 = res.reshape((img.shape))centers64 = np.uint8(centers64)
res = centers64[labels64.flatten()]
dst64 = res.reshape((img.shape))#图像转换为RGB显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB)
dst4 = cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB)
dst8 = cv2.cvtColor(dst8, cv2.COLOR_BGR2RGB)
dst16 = cv2.cvtColor(dst16, cv2.COLOR_BGR2RGB)
dst64 = cv2.cvtColor(dst64, cv2.COLOR_BGR2RGB)#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']#显示图像
titles = [u'原始图像', u'聚类图像 K=2', u'聚类图像 K=4',u'聚类图像 K=8', u'聚类图像 K=16', u'聚类图像 K=64']
images = [img, dst2, dst4, dst8, dst16, dst64]
for i in range(6): plt.subplot(2,3,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([])
plt.show()

纯属笔记用,若有侵权请联系我删除

小白学习中,感谢各位大佬的博客帮助。


推荐阅读
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 机器学习核心概念与技术
    本文系统梳理了机器学习的关键知识点,涵盖模型评估、正则化、线性模型、支持向量机、决策树及集成学习等内容,并深入探讨了各算法的原理和应用场景。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • Ihaveastringwithquotesaroundthepathasfollows:我在路径周围有一个带引号的字符串,如下所示:C:\ProgramFiles(x ... [详细]
  • 在网站制作中随时可用的10个 HTML5 代码片段
    HTML很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单。在这篇文章中,我收集了10个超有用的HTML代码片段,有HTML5启动模板、空白图片、打电话和发短信、自动完 ... [详细]
author-avatar
214812031_88fe08
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有