当前位置: 首页 > 科技观察

各种无监督聚类算法的Python实现简介

时间:2023-03-21 19:15:37 科技观察

无监督学习是一类用于在数据中寻找模式的机器学习技术。无监督学习算法使用的输入数据是未标记的,也就是说数据只给出输入变量(自变量X),不给出相应的输出变量(因变量)。在无监督学习中,算法本身会发现数据中有趣的结构。人工智能研究领军人物严乐存解释说:无监督学习可以自己学习,不需要被明确告知自己所做的每一件事是否正确。这才是真正人工智能的关键!监督学习VS无监督学习在监督学习中,系统会尝试从之前给出的示例中学习。(然而,在无监督学习中,系统试图直接从给定的示例中找到模式。)因此,如果数据集被标记,则它是一个监督学习问题;如果数据未标记,则为未标记问题。监督学习问题。上图是监督学习的一个例子,它使用回归技术来寻找特征之间的最佳拟合曲线。在无监督学习中,输入数据根据特征进行划分,根据数据所属的簇进行预测。重要术语特征:进行预测时使用的输入变量。预测:给定输入示例的模型输出。示例:数据集中的一行。一个例子包含一个或多个特征,可能还有一个标签。标签:特征对应的真实结果(与预测相反)。准备无监督学习所需的数据在本文中,我们使用Iris数据集进行初始预测工作。该数据集包含150条记录,每条记录包含5个特征-花瓣长度、花瓣宽度、萼片长度、萼片宽度、花类别。花分为三类:IrisSetosa、IrisVIrginica和IrisVersicolor。在本文中,鸢尾花的四个特征被提供给无监督算法来预测它属于哪个类别。本文使用Python环境下的sklearn库加载Iris数据集,使用matplotlib进行数据可视化。这是用于探索数据集的代码片段:#ImportingModulesfromsklearnimportdatasetsimportmatplotlib.pyplotasplt#Loadingdatasetiris_df=datasets.load_iris()#Availablemethodsondatasetprint(dir(iris_df))#Featuresprint(iris_df.feature_names)#Targetsprint(iris_df.df.target)#Targetsprint(iris.df.namesprint(Target_iris_df)target_names)label={0:'red',1:'blue',2:'green'}#DatasetSlicingx_axis=iris_df.data[:,0]#SepalLengthy_axis=iris_df.data[:,2]#SepalWidth#Plottingplt。散点图(x_axis,y_axis,c=iris_df.target)plt.show()['DESCR','data','feature_names','target','target_names']['sepallength(cm)','sepalwidth(cm)','petallength(cm)','petalwidth(cm)'][000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222]['setosa''versicolor''virginica']紫色:Setosa,绿色:Versicolor,黄色:Virginica聚类分析在聚类分析中,数据被分成不同的组。简而言之,这一步旨在从整体数据中分离出具有相似特征的组,并将它们分配到聚类中。可视化示例:如上图,左图是未分类的原始数据,右图是聚类后的数据(根据数据本身的特征进行分类)。当给定一个要预测的输入时,它会根据其特征检查它属于哪个簇,并据此进行预测。K-means聚类的Python实现K-means是一种迭代聚类算法,其目标是在每次迭代中找到局部最大值。该算法需要最初选择的簇数。因为我们知道这个问题涉及3类花,所以我们编写算法通过将参数“n_clusters”传递给K-means模型将数据分为3类。现在,我们将三个数据点(输入)随机分成三个簇。基于每个点之间的质心距离,下一个给定的输入数据点将被分成独立的簇。接下来,我们将重新计算所有集群的质心。每个簇的质心是定义结果集的特征值集。研究质心的特征权重可以用来定性地解释每个聚类代表哪种类型的组。我们从sklearn库中导入K-means模型,拟合特征并进行预测。K-means算法的Python实现:#ImportingModulesfromsklearnimportdatasetsfromsklearn.clusterimportKMeans#Loadingdatasetiris_df=datasets.load_iris()#DeclaringModelmodel=KMeans(n_clusters=3)#FittingModelmodel.fit(iris_df.data)#Predictngasingleinputmodel3.dicted_predicted,[20.8,1.6]])#Predictionontheentiredataall_predictions=model.predict(iris_df.data)#PrintingPredictionsprint(predicted_label)print(all_predictions)[0][000000000000000000000000000000000000000000000000002212222222222222222222222221222222222222222222222212111121111112211112121211221111121111211121112112]层次聚类层次聚类,顾名思义,是一种能够构建有层次的簇alg??orithm.在这个算法的开始,每个数据点都是一个簇。然后,将两个最接近的集群合并为一个。最终,当所有点都合并到一个簇中时,算法停止。层次聚类的实现可以用树状图可视化。下面我们来看一个粮食数据层次聚类的例子。数据集链接:https://raw.githubusercontent.com/vihar/unsupervised-learning-with-python/master/seeds-less-rows.csv1。层级聚合类的Python实践:#ImportingModulesfromscipy.cluster.hierarchyimportlinkage,dendrogramimportmatplotlib.pyplotaspltimportpandasapd#ReadingtheDataFrameseeds_df=pd.read_csv("https://raw.githubusercontent.com/vihar/unsupervised-learning-with-python-less/master/seeds-rows.csv")#RemovethegrainspeciesfromtheDataFrame,saveforlatervariety=list(seeds_df.pop('grain_variety'))#ExtractthemeasurementsasaNumPyarraysamples=seeds_df.values"""使用链接()函数和方法='complete'关键字参数对样本执行层次聚类。分配结果"合并链接=。"(样本,方法='完整')“”“使用树状图()功能绘制树状图合并,指定关键字参数标签=品种,叶旋转=90,叶字体大小=6。”“”树状图(合并,标签=品种ies,leaf_rotation=90,leaf_font_size=6,)plt.show()2.K-means和层次聚类的区别层次聚类不能很好地处理大数据,而K-means聚类可能是由于K-means算法聚类的时间复杂度是线性的,即O(n);而层次聚类的时间复杂度是二次的,即O(n2)。在K均值聚类中,由于我们最初是随机选择聚类,因此多次运行算法的结果可能会有很大差异。层次聚类的结果是可重现的。研究表明,当簇的形状为超球体(例如:2D空间中的圆,3D空间中的球体)时,K-means算法表现良好。K-means算法抗噪声数据能力差(对噪声数据鲁棒性差),而层次聚类可以直接利用噪声数据进行聚类分析。t-SNE聚类这是一种视觉无监督学习方法。t-SNE指的是t分布的随机邻域嵌入。它将高维空间映射为可视化的二维或三维空间。具体来说,它会用2D或3D数据点对高维空间中的对象进行建模,通过使用附近的高概率点对相似对象进行建模,而距离较远的点对不相似的对象进行建模。Iris数据集的t-SNE聚类的Python实现:#ImportingModulesfromsklearnimportdatasetsfromsklearn.manifoldimportTSNEimportmatplotlib.pyplotasplt#Loadingdatasetiris_df=datasets.load_iris()#DefiningModelmodel=TSNE(learning_rate=100)#FittingModeltransformed=model.fit_dfform.dataPlotting2dt-transformed[:axis=,0]y_axis=transformed[:,1]plt.scatter(x_axis,y_axis,c=iris_df.target)plt.show()Purple:Setosa,Green:Versicolor,Yellow:Virginicahere,Irisdatasetwith4features(4维)转换为二维空间并显示在二维图像中。同样,t-SNE模型可用于具有n个特征的数据集。DBSCAN聚类DBSCAN(基于密度的噪声空间聚类)是一种流行的聚类算法,在预测分析中用作K-means算法的替代方法。它不需要输入集群的数量来运行。但是,您需要调整其他两个参数。scikit-learn对DBSCAN算法的实现提供了默认的“eps”和“min_samples”参数,但一般情况下,用户需要对其进行调优。参数“eps”是被认为在同一邻域中的两个数据点之间的最大距离。参数“min_samples”是同一集群中邻域中数据点的最小数量。1.DBSCAN聚类的Python实现:#ImportingModulesfromsklearn.datasetsimportload_irisimportmatplotlib.pyplotaspltfromsklearn.clusterimportDBSCANfromsklearn.decompositionimportPCA#LoadDatasetiris=load_iris()#DeclaringModeldbscan=DBSCAN()#Fittingdbscan.fit(iris.caping=datas).适合(iris.data)pcapca_2d=pca.transform(iris.data)#PlotbasedonClassforiinrange(0,pca_2d.shape[0]):ifdbscan.labels_[i]==0:c1=plt.scatter(pca_2d[i,0],pca_2d[i,1],c='r',marker='+')elifdbscan.labels_[i]==1:c2=plt.scatter(pca_2d[i,0],pca_2d[i,1],c='g',marker='o')elifdbscan.labels_[i]==-1:c3=plt.scatter(pca_2d[i,0],pca_2d[i,1],c='b',marker='*')plt.legend([c1,c2,c3],['Cluster1','Cluster2','Noise'])plt.title('DB2.更多无监督学习技术:主成分分析(PCA)AnomalyDetectionAutoencoderDeepBeliefNetworkHebbianLearningGenerativeAdversarialNetwork(GAN)Self-OrganizingMap原文链接:https://towardsdatascience.com/unsupervised-learning-with-python-173c51dc7f03【本文为“机器”栏目原文翻译《机器之心》作者微信公众号“机器之心(id:almosthuman2014)”】点此阅读作者更多信息好文