[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-MeansBIRCH树状聚类MeanShift)

Posted Eastmount

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-MeansBIRCH树状聚类MeanShift)相关的知识,希望对你有一定的参考价值。

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

前一篇文章讲述了回归模型的原理知识,包括线性回归、多项式回归和逻辑回归,并详细介绍Python Sklearn机器学习库的线性回归和逻辑回归算法及案例。本文介绍聚类算法的原理知识级案例,包括K-Means聚类、BIRCH算法、PCA降维聚类、均值漂移聚类、文本聚类等。基础文章,希望对您有所帮助。

下载地址:

前文赏析:

第一部分 基础语法

第二部分 网络爬虫

第三部分 数据分析和机器学习

作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


在过去,科学家会根据物种的形状习性规律等特征将其划分为不同类型的门类,比如将人种划分为黄种人、白种人和黑种人,这就是简单的人工聚类方法。聚类是将数据集中某些方面相似的数据成员划分在一起,给定简单的规则,对数据集进行分堆,是一种无监督学习。聚类集合中,处于相同聚类中的数据彼此是相似的,处于不同聚类中的元素彼此是不同的。本章主要介绍聚类概念和常用聚类算法,然后详细讲述Scikit-Learn机器学习包中聚类算法的用法,并通过K-Means聚类、Birch层次聚类及PAC降维三个实例加深读者印象。

一.聚类

俗话说“物以类聚,人以群分”,聚类(Clustering)就是根据“物以类聚”的原理而得。从广义上说,聚类是将数据集中在某些方面相似的数据成员放在一起,聚类中处于相同类簇中的数据元素彼此相似,处于不同类簇中的元素彼此分离。
由于在聚类中那些表示数据类别的分组信息或类标是没有的,即这些数据是没有标签的,所有聚类又被称为无监督学习(Unsupervised Learning)。

1.算法模型

聚类是将本身没有类别的样本聚集成不同类型的组,每一组数据对象的集合都叫做簇。聚类的目的是让属于同一个类簇的样本之间彼此相似,而不同类簇的样本应该分离。图1表示聚类的算法模型图。

在这里插入图片描述

聚类模型的基本步骤包括:

  • 训练。通过历史数据训练得到一个聚类模型,该模型用于后面的预测分析。需要注意的是,有的聚类算法需要预先设定类簇数,如KMeans聚类算法。
  • 预测。输入新的数据集,用训练得到的聚类模型对新数据集进行预测,即分堆处理,并给每行预测数据计算一个类标值。
  • 可视化操作及算法评价。得到预测结果之后,可以通过可视化分析反应聚类算法的好坏,如果聚类结果中相同簇的样本之间距离越近,不同簇的样本之间距离越远,其聚类效果越好。同时采用相关的评价标准对聚类算法进行评估。

常用聚类模型包括:

  • K-Means聚类
  • 层次聚类
  • DBSCAN
  • Affinity Propagatio
  • MeanShift

2.常见聚类算法

聚类算法在Scikit-Learn机器学习包中,主要调用sklearn.cluster子类实现,下面对常见的聚类算法进行简单描述,后面主要介绍K-Means算法和Birch算法实例。

(1) K-Means
K-Means聚类算法最早起源于信号处理,是一种最经典的聚类分析方法。它是一种自下而上的聚类方法,采用划分法实现,其优点是简单、速度快;缺点是必须提供聚类的数目,并且聚类结果与初始中心的选择有关,若不知道样本集要聚成多少个类别,则无法使用K-Means算法。Sklearn包中调用方法如下:

from sklearn.cluster import KMeans
clf = KMeans(n_clusters=2)
clf.fit(X,y)

(2) Mini Batch K-Means
Mini Batch K-means是KMeans的一种变换,目的为了减少计算时间。其实现类是MiniBatchKMeans。Sklearn包中调用方法如下:

from sklearn.cluster import MiniBatchKMeans
X= [[1],[2],[3],[4],[3],[2]]
mbk = MiniBatchKMeans(init='k-means++', n_clusters=3, n_init=10)
clf = mbk.fit(X)
print(clf.labels_)
#输出:[0 2 1 1 1 2]

(3) Birch
Birch是平衡迭代归约及聚类算法,全称为Balanced Iterative Reducing and Clustering using Hierarchies,是一种常用的层次聚类算法。该算法通过聚类特征(Clustering Feature,CF)和聚类特征树(Clustering Feature Tree,CFT)两个概念描述聚类。聚类特征树用来概括聚类的有用信息,由于其占用空间小并且可以存放在内存中,从而提高了算法的聚类速度,产生了较高的聚类质量,Birch算法适用于大型数据集。

Sklearn包中调用方法如下:

from sklearn.cluster import Birch
X = [[1],[2],[3],[4],[3],[2]]
clf = Birch(n_clusters=2)
clf.fit(X)
y_pred = clf.fit_predict(X)
print(clf)
print(y_pred)
#输出:[1 1 0 0 0 1]

上述代码调用Birch算法聚成两类,并对X数据进行训练,共6个点(1、2、3、4、3、2),然后预测其聚类后的类标,输出为0或1两类结果,其中点1、2、2输出类标为1,点3、4、3输出类标为0。这是一个较好的聚类结果,因为值较大的点(3、4)聚集为一类,值较小的点(1、2)聚集为另一类。这里只是进行了简单描述,后面将讲述具体的算法及实例。


(4) Mean Shift
Mean Shift是均值偏移或均值漂移聚类算法,最早是1975年Fukunaga等人在一篇关于概率密度梯度函数的估计论文中提出。它是一种无参估计算法,沿着概率梯度的上升方向寻找分布的峰值。Mean Shift算法先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束。

在这里插入图片描述


(5) DBSCAN
DBSCAN是一个典型的基于密度的聚类算法,它与划分聚类方法、层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。与K-Means方法相比,DBSCAN不需要事先知道要形成的簇类的数目,它可以发现任意形状的簇类,同时该算法能够识别出噪声点,对于数据集中样本的顺序不敏感。但也存在一定缺点:DBSCAN聚类算法不能很好反映高维数据。


3.性能评估

聚类根据文档的相似性把一个文档集合中的文档分成若干类,但是究竟分成多少类,这个要取决于文档集合里文档自身的性质。图3是Scikit-Learn官网中DBSCAN聚类示例结果,该聚类算法应该把文档集合分成3类,而不是2类或4类,这就涉及到了聚类算法评价。

在这里插入图片描述

聚类算法的评价应该考虑:聚类之间是否较好地相互分离、同一类簇中的点是否都靠近的中心点、聚类算法是否正确识别数据的类簇或标记。聚类算法的常见评价指标包括纯度(Purity)、F值(F-measure)、熵值(Entropy)和RI,其中F值最为常用。

(1) F值(F-measure)
F值(F-measure或F-score)的计算包括两个指标:精确率(Precision)和召回率(Recall)。精确率定义为检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率;召回率定义为检索出的相关文档数和文档库中所有相关文档数的比率,衡量的是检索系统的查全率。公式如下:

在这里插入图片描述

在这里插入图片描述

其中,参数N表示实验结果中正确识别出的聚类类簇数,S表示实验结果中实际识别出的聚类类簇数,T表示数据集中所有真实存在的聚类相关类簇数。

精确率和召回率两个评估指标在特定的情况下是相互制约的,因而很难使用单一的评价指标来衡量实验的效果。F-值是准确率和召回率的调和平均值,它可作为衡量实验结果的最终评价指标,F值更接近两个数中较小的那个。F值指的计算公式如下公式所示:

在这里插入图片描述


(2) 纯度(Purity)
Purity方法是极为简单的一种聚类评价方法,它表示正确聚类的文档数占总文档数的比例。公式如下:

在这里插入图片描述

其中,参数m表示整个聚类划分涉及的成员个数;聚类i的纯度定义为Pi;K表示聚类的类簇数目。举个示例,假设聚类成3堆,其中x表示一类数据集,o表示一类数据集,◇表示一类数据集,如图4所示。

在这里插入图片描述

纯度为正确聚类的文档数占总文档数的比例,即:purity=(5+4+3)/17=0.71。其中第一堆聚集正确5个x,第二堆正确聚集4个o,第三队正确聚集3个◇。Purity方法优点在于计算过程简便,值在0~1之间,完全错误的聚类方法值为0,完全正确的聚类方法值为1;其缺点是无法对聚类方法给出正确的评价,尤其是每个文档单独聚集成一类的情况。

(3) 兰德指数(RI)
兰德指数(Rand Index,简称RI)是一种用排列组合原理来对聚类进行评价的手段,公式如下:

在这里插入图片描述

其中参数TP表示被聚在一类的两个文档被正确分类,TN表示不应该被聚在一类的两个文档被正确分开,FP表示不应该放在一类的文档被错误的放在了一类,FN表示不应该分开的文档被错误的分开。

RI越大表示聚类效果准确性越高,同时每个类内的纯度越高,更多评价方法请读者结合实际数据集进行分析。


二.K-Means

K-Means聚类是最常用的聚类算法,最初起源于信号处理,其目标是将数据点划分为K个类簇,找到每个簇的中心并使其度量最小化。该算法的最大优点是简单、便于理解,运算速度较快,缺点是只能应用于连续型数据,并且要在聚类前指定聚集的类簇数。

1.算法描述

(1) K-Means聚类算法流程
下面作者采用通俗易懂的方法描述K-Means聚类算法的分析流程,步骤如下:

  • 第一步,确定K值,即将数据集聚集成K个类簇或小组。
  • 第二步,从数据集中随机选择K个数据点作为质心(Centroid)或数据中心。
  • 第三步,分别计算每个点到每个质心之间的距离,并将每个点划分到离最近质心的小组,跟定了那个质心。
  • 第四步,当每个质心都聚集了一些点后,重新定义算法选出新的质心。
  • 第五步,比较新的质心和老的质心,如果新质心和老质心之间的距离小于某一个阈值,则表示重新计算的质心位置变化不大,收敛稳定,则认为聚类已经达到了期望的结果,算法终止。
  • 第六步,如果新的质心和老的质心变化很大,即距离大于阈值,则继续迭代执行第三步到第五步,直到算法终止。

图5是对身高和体重进行聚类的算法,将数据集的人群聚集成三类。

在这里插入图片描述


2.K-Means聚类示例

下面通过一个例子讲解K-Means聚类算法,从而加深读者的印象。假设存在如下表1所示六个点,需要将其聚类成两堆。流程如下:

在这里插入图片描述

坐标点	X坐标	Y坐标
P1	1	1
P2	2	1
P3	1	3
P4	6	6
P5	8	5
P6	7	8

在坐标轴中绘制这6个点的分布如图6所示。

在这里插入图片描述

第一步:随机选取质心。假设选择P1和P2点,它们则为聚类的中心。

第二步:计算其他所有点到质心的距离。
计算过程采用勾股定理,如P3点到P1的距离为:

在这里插入图片描述

P3点到P2距离为:

在这里插入图片描述

P3离P1更近,则选择跟P1聚集成一堆。同理P4、P5、P6算法如下:

在这里插入图片描述

此时聚类分堆情况如下:

  • 第一组:P1、P3
  • 第二组:P2、P4、P5、P6

第三步:组内从新选择质心。
这里涉及到距离的计算方法,通过不同的距离计算方法可以对K-Means聚类算法进行优化。这里计算组内每个点X坐标的平均值和Y坐标的平均值,构成新的质心,它可能是一个虚拟的点。

  • 第一组新质心:

在这里插入图片描述

  • 第二组新质心:

在这里插入图片描述

第四步:再次计算各点到新质心的距离。此时可以看到P1、P2、P3离PN1质心较近,P4、P5、P6离PN2质心较近。

在这里插入图片描述

则聚类分堆情况如下,注意由于新的质心PN1和PN2是虚拟的两个点,则不需要对PN1和PN2进行分组。。

  • 第一组:P1、P2、P3
  • 第二组:P4、P5、P6

第五步:同理,按照第三步计算新的质心。

  • 第一组新质心:

在这里插入图片描述

  • 第二组新质心:

在这里插入图片描述

第六步:计算点到新的质心距离。

在这里插入图片描述

这时可以看到P1、P2、P3离PN1更近,P4、P5、P6离PN2更近,所以第二聚类分堆的结果是:

  • 第一组:P1、P2、P3
  • 第二组:P4、P5、P6

结论:此时发现,第四步和第六步分组情况都是一样的,说明聚类已经稳定收敛,聚类结束,其聚类结果P1、P2、P3一组,P4、P5、P6是另一组,这和我们最初预想的结果完全一致,说明聚类效果良好。这就是KMeans聚类示例的完整过程。


3.Sklearn中K-Means用法介绍

在Sklearn机器学习包中,调用cluster聚类子库的Kmeans()函数即可进行Kmeans聚类运算,该算法要求输入聚类类簇数。KMeans聚类构造方法如下:

sklearn.cluster.KMeans(n_clusters=8
	, init='k-means++'
	, n_init=10
	, max_iter=300
	, tol=0.0001
	, precompute_distances=True
	, verbose=0
	, random_state=None
	, copy_x=True
	, n_jobs=1)

其中,参数解释如下:

  • n_clusters:表示K值,聚类类簇数
  • max_iter:表示最大迭代次数,可省略
  • n_init:表示用不同初始化质心运算的次数,由于K-Means结果是受初始值影响的局部最优的迭代算法,因此需要多运行几次算法以选择一个较好的聚类效果,默认是10,一般不需要更改,如果你的K值较大,则可以适当增大这个值
  • Init:是初始值选择的方式,可以为完全随机选择’random’,优化过的’k-means++‘或者自己指定初始化的K个质心,建议使用默认的’k-means++’

下面举个简单的实例,分析前面的例子中的6个点,设置聚类类簇数为2(n_clusters=2),调用KMeans(n_clusters=2)函数聚类,通过clf.fit()函数装载数据训练模型。代码如下:

from sklearn.cluster import KMeans
X = [[1,1],[2,1],[1,3],[6,6],[8,5],[7,8]]
y = [0,0,0,1,1,1]
clf = KMeans(n_clusters=2)
clf.fit(X,y)
print(clf)
print(clf.labels_)

输出结果如下:

>>> 
KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=2, n_init=10,
    n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,
    verbose=0)
[0 0 0 1 1 1]
>>> 

clf.labels_表示输出K-means聚类后的类标。由于聚类类簇设置为2,故类标为0或1,其中X[1,1]、X[2,1]、X[1,3]聚类后属于0类,X[6,6]、X[8,5]、X[7,8]聚类后属于1类。

调用Matplotlib扩展包的scatter()函数可以绘制散点图,代码的具体含义将在接下来的K-Means分析篮球数据中详细介绍。代码如下:

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn.cluster import KMeans
X = [[1,1],[2,1],[1,3],[6,6],[8,5],[7,8]]
y = [0,0,0,1,1,1]
clf = KMeans(n_clusters=2)
clf.fit(X,y)
print(clf)
print(clf.labels_)

import matplotlib.pyplot as plt
a = [n[0] for n in X]  
b = [n[1] for n in X]
plt.scatter(a, b, c=clf.labels_)
plt.show()

输出结果如图7所示,其中右上角红色三个点聚集在一起,左下角蓝色三个点聚集在一起,聚类效果明显。

在这里插入图片描述

读者为了区分,建议将不同类簇的点绘制成不同类型的散点图,便于对比观察。


4.K-Means分析篮球数据

(1) 篮球数据集
数据集使用的是篮球运动员数据:KEEL-dateset Basketball dataset,下载地址为:

在这里插入图片描述

该数据集主要包括5个特征,共96行数据,特征包括运动员身高(height)、每分钟助攻数(assists_per_minute)、运动员出场时间(time_played)、运动员年龄(age)和每分钟得分数(points_per_minute)。其特征和值域如图8所示,比如每分钟得分数为0.45,一场正常的NBA比赛共48分钟,则场均能得21.6分。

在这里插入图片描述

下载篮球数据集,前20行数据如图9所示。

在这里插入图片描述


(2) K-Means聚类
现在需要通过篮球运动员的数据,判断该运动员在比赛中属于什么位置。如果某个运动员得分能力比较强,他可能是得分后卫;如果篮板能力比较强,他可能是中锋。

下面获取助攻数和得分数两列数据的20行,相当于20*2矩阵。主要调用Sklearn机器学习包的KMeans()函数进行聚类,调用Matplotlib扩展包绘制图形。完整代码如下:

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn.cluster import KMeans  
  
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.1906, 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.2521, 0.5735],  
     [0.1007, 0.6318],  
     [0.1067, 0.4326],  
     [0.1956, 0.4280]     
    ]  
print(X)

# Kmeans聚类
clf = KMeans(n_clusters=3)  
y_pred = clf.fit_predict(X)  
print(clf)   
print(y_pred)  

# 可视化操作
import numpy as np  
import matplotlib.pyplot as plt  
x = [n[0] for n in X]  
y = [n[1] for n in X]

plt.scatter(x, y, c=y_pred, marker='x')   
plt.title("Kmeans-Basketball Data")   
plt.xlabel("assists_per_minute")  
plt.ylabel("points_per_minute")  
plt.legend(["Rank"])   
plt.show()  

运行结果如下图10所示,从图中可以看到聚集成三类,顶部红色点所代表的球员比较厉害,得分和助攻都比较高,可能类似于NBA中乔丹、科比等得分巨星;中间蓝色点代表普通球员那一类;右下角绿色表示助攻高得分低的一类球员,可能是控位。代码中y_pred表示输出的聚类类标,类簇数设置为3,则类标位0、1、2,它与20个球员数据一一对应。

在这里插入图片描述


(3) 代码详解
推荐读者结合作者分享的文件用法进行读取及聚类。

  • from sklearn.cluster import KMeans
    表示在sklearn包中导入KMeans聚类模型,调用 sklearn.cluster.KMeans 这个类。

  • X = [[164,62],[156,50],…]
    X是数据集,包括2列20行,对应20个球员的助攻数和得分数。

  • clf = KMeans(n_clusters=3)
    表示调用KMeans()函数聚类分析,并将数据集聚集成类簇数为3后的模型赋值给clf。

  • y_pred =clf.fit_predict(X)
    调用clf.fit_predict(X)函数对X数据集(20行数据)进行聚类分析,并将预测结果赋值给y_pred变量,每个y_pred对应X的一行数据,聚成3类,类标分别为0、1、2。

  • print(y_pred)
    输出预测结果:[0 2 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1]。

  • import matplotlib.pyplot as plt
    导入matplotlib.pyplot扩展包来进行可视化绘图,as表示重命名为plt,便于后续调用。

  • x = [n[0] for n in X]
    y = [n[1] for n in X]
    分别获取获取第1列和第2列值,并赋值给x和y变量。通过for循环获取,n[0]表示X第一列,n[1]表示X第2列。

  • plt.scatter(x, y, c=y_pred, marker=‘o’)
    调用scatter()函数绘制散点图,横轴为x,获取的第1列数据;纵轴为y,获取的第2列数据;c=y_pred为预测的聚类结果类标;marker='o’说明用点表示图形。

  • plt.title(“Kmeans-Basketball Data”)
    表示绘制图形的标题为“Kmeans-Basketball Data”。

  • plt.xlabel(“assists_per_minute”)

  • plt.ylabel(“points_per_minute”)
    表示输出图形x轴的标题和y轴的标题。

  • plt.legend([“Rank”])
    设置右上角图例。

  • plt.show()
    最后调用show()函数将绘制的图形显示出来。


5.K-Means聚类优化

上面的代码存在一个问题是需要优化的,可能细心的读者已经发现了。那就是前面的代码定义了X数组(共20行、每行2个特征),再对其进行数据分析,而实际数据集通常存储在TXT、CSV、XLS等格式文件中,并采用读取文件的方式进行数据分析的。那么,如何实现读取文件中数据再进行聚类分析的代码呢?

接下来,作者将完整的96行篮球数据存储至TXT文件进行读取操作,再调用K-Means算法聚类分析,并将聚集的三类数据绘制成想要的颜色和形状。假设下载的篮球数据集存在在本地data.txt文件中,如下所示。

在这里插入图片描述

首先,需要将data.txt数据读取,然后赋值到data变量数组中,代码如下。

# -*- coding: utf-8 -*-  
import os

data = []
for line in open("data.txt", "r").readlines():  
    line = line.rstrip()         #删除换行    
    result = ' '.join(line.split())  #删除多余空格,保存一个空格连接
    #获取每行的五个值,如'0 0.0888 201 36.02 28 0.5885',并将字符串转换为小数  
    s = [float(x) for x in result.strip().split(' ')]  
    #输出结果:['0', '0.0888', '201', '36.02', '28', '0.5885']  
    print(s)  
    #数据存储至data  
	data.append(s)  
#输出完整数据集   
print(data) 
print(type(data))

现在输出的结果如下:

['0 0.0888 201 36.02 28 0.5885',  
 '1 0.1399 198 39.32 30 0.8291',  
 '2 0.0747 198 38.80 26 0.4974',  
 '3 0.0983 191 40.71 30 0.5772',  
 '4 0.1276 196 38.40 28 0.5703',
 .... 
]

然后需要获取数据集中的任意两列数据进行数据分析,赋值给二维矩阵X,对应可视化图形的X轴和Y轴,这里调用dict将两列数据绑定,再将dict类型转换位list。

#获取任意列数据
print('第一列 第五列数据')  
L2 = [n[0] for n in data]  #第一列表示球员每分钟助攻数:assists_per_minute  
L5 = [n[4] for n in data]  #第五列表示球员每分钟得分数:points_per_minute    
T = dict(zip(L2,L5))      #两列数据生成二维数据
type(T)

#下述代码将dict类型转换为list    
X = list(map(lambda x,y: (x,y), T.keys(),T.values()))  
print(type(X)) 
print(X)

输出结果如下图所示:

在这里插入图片描述

接下来就是调用KMeans(n_clusters=3)函数聚类,聚集的类簇数为3。输出聚类预测结果,共96行数据,每个y_pred对应X一行数据或一个球员,聚成3类,其类标为0、1、2。其中,clf.fit_predict(X) 表示载入数据集X训练预测,并且将聚类的结果赋值给y_pred。

from sklearn.cluster import

以上是关于[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-MeansBIRCH树状聚类MeanShift)的主要内容,如果未能解决你的问题,请参考以下文章

[Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归多项式回归逻辑回归)

[Python从零到壹] 六十一.图像识别及经典案例篇之基于纹理背景和聚类算法的图像分割

[Python从零到壹] 六十一.图像识别及经典案例篇之基于纹理背景和聚类算法的图像分割

[Python从零到壹] 六十三.图像识别及经典案例篇之图像漫水填充分割应用

[Python从零到壹] 六十三.图像识别及经典案例篇之图像漫水填充分割应用

[Python从零到壹] 五十三.图像增强及运算篇之直方图均衡化处理