数学建模聚类分析——python实现

Posted Fonsi-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学建模聚类分析——python实现相关的知识,希望对你有一定的参考价值。

目录

一、储备知识

(1)何为聚类分析:

(2)分类方法:

二、聚类分析的一般步骤

三、聚类实操——python实现

四、代码总结


一、储备知识

(1)何为聚类分析:

        聚类分析又称为群分析,是研究问题的一种多元统计方法。聚类,就是聚集具有相似元素的集合成之为一类。一般来说存在着定性研究和定量研究以及相融汇的三种分析方法。通过选取共同指标,分析元素指标值之间的差距从而达到分类的目的。

(2)分类方法:

        一般来说比较常用的是Q型分类(样品分类)和R型分类(指标分类),通俗来说前者是对样品进行聚类,后者是对变量进行聚类。此处重点讲解Q型分类,指标分类会在模糊聚类中说明

二、聚类分析的一般步骤

① 确定聚类类型:Q&R

② 数据预处理:使用标准化来克服不同的量纲的影响

        标准化处理方法:(按矩阵列来处理)

 

③ 研究样品之间的相关关系:

        1.两者度量方式(相似系数和距离)

        相似系数:样品性质越接近,它们之间的相似系数的绝对值越接近与1;

                计算方法:夹角余弦;相关系数等

        距离:将每个样品看作p维空间上的一个点,通过计算任意两个样品之间的距离,可达到聚类的目的。因为距离越接近的点现归为一类,距离远的点暂时归为不同类。

                常用距离:明科夫斯基距离;欧式距离;绝对值距离;切比雪夫距离;兰氏距离和马氏距离。那比较常用的是以下这些距离:

 ④ 计算距离矩阵或相似性系数矩阵D

       由距离矩阵D,找到当前最小的,并将类Gi合为一类得到一个新的类Gr=Gi、Gj,因为不太可能一次就聚类成功,因此要重新计算类间的距离,得到新的矩阵D,重复到全部合为一类。

三、聚类实操——python实现

        事实上这里用R语言为更加简单。

        根据步骤,第一步本应该对其进行标准化处理,但事实上此处并不需要,因为各个指标本就在量纲上保持了统一了。但是根据流程也有必要对其进行标准化。

① 导入相关库

import numpy as np
from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram,linkage
import xlrd as xr
import pandas as pd
from sklearn import preprocessing
from sklearn.cluster import AgglomerativeClustering

② 读取excel文件数据

file_location="/Users/lifangjian/Desktop/聚类数据.xls"
data=xr.open_workbook(file_location)
sheet = data.sheet_by_index(0)
lie=sheet.ncols
hang=sheet.nrows

③ 形成数据矩阵,这里有很多处理方式,一种是常规的遍历法,另一种是列表推导式。默认第一行是变量名,比如指标A,指标B,第一列是样品名,比如工厂1,工厂2。

#如果第一行是变量名,第一列是不同样本_遍历法
datam=[]
for i in range(1,hang):
    hanglie=[]
    for j in range(1,lie):
        hanglie.append(sheet.cell_value(i,j))
    datam.append(hanglie)       
print(datam)
#列表推导式法_得到所有的值,按照行列排列,第一行j个数,第2行j个数。
hanglie=[sheet.cell_value(i,j) for i in range(1,hang) for j in range(1,lie)] #得到所有ij的值
stats = [[sheet.cell_value(r,c) for c in range(1,sheet.ncols)] for r in range(1,sheet.nrows)]#得到所有行列值
print(stats)
stats = pd.DataFrame(stats)
print(stats)

#如果第一行不同的变量,第一行是不同样本_遍历法,如果不是,建议在excel文件中使用=transpose命令
lie=sheet.nrows
hang=sheet.ncols
sheet= data.sheet_by_index(1)
datam=[]
for j in range(1,lie):
    liehang=[]
    for i in range(1,hang):
        liehang.append(sheet.cell_value(i,j))
    datam.append(liehang)       
print(datam)

输出数据矩阵结果

[[0.0, 6.0], [0.0, 5.0], [2.0, 5.0], [2.0, 3.0], [4.0, 4.0], [4.0, 3.0], [5.0, 1.0], [6.0, 2.0], [6.0, 1.0], [7.0, 0.0], [-4.0, 3.0], [-2.0, 2.0], [-3.0, 2.0], [-3.0, 0.0], [-5.0, 2.0], [1.0, 1.0], [0.0, -1.0], [0.0, -2.0], [-1.0, -1.0], [-1.0, -3.0], [-3.0, -5.0]]

stats_frame=pd.DataFrame(stats)
normalizer=preprocessing.scale(stats_frame)
stats_frame_nomalized=pd.DataFrame(normalizer)
print(stats_frame)
print(stats_frame_nomalized)

        如果需要标准化,就按照以上的代码实现就可以,上面是Z分数标准化法。

④ 输出聚类过程

z=linkage(stats,"average",metric='euclidean',optimal_ordering=True)
print(z)
# average=类平均法,ward=离差平方和法,sin=最短距离法,com=最长距离法,med=中间距离法,cen=重心法,fle=可变类平均法

        第一列表示聚类类别,第二列表示和哪一类聚类,第三列是类之间的距离,第四列是簇中含有的类别的个数 

这里对于各种方式的选取建议在IDLE中输入:

help(linkage)

⑤ 画出动态聚类图

fig, ax = plt.subplots(figsize=(10,9))
dendrogram(z, leaf_font_size=14) #画图
plt.title("Hierachial Clustering Dendrogram")
plt.xlabel("Cluster label")
plt.ylabel("Distance")
plt.axhline(y=4) #画一条分类线
plt.show()

         要注意,python里面第一个是0,因此此处正常阅读时要给Cluster label加1来看。

⑤ 画出聚类散点图,以2簇为例

cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='average')
#linkage模式可以调整,n_cluser可以调整
print(cluster.fit_predict(stats))
plt.figure(figsize=(10, 7))  
plt.scatter(stats_frame[0],stats_frame[1], c=cluster.labels_)
plt.show()

四、代码总结

import numpy as np
from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram,linkage
import xlrd as xr
import pandas as pd
from sklearn import preprocessing
from sklearn.cluster import AgglomerativeClustering
file_location="/Users/lifangjian/Desktop/聚类数据.xls"
data=xr.open_workbook(file_location)
sheet = data.sheet_by_index(0)
lie=sheet.ncols
hang=sheet.nrows
#如果第一行是变量名,第一列是不同样本_遍历法
datam=[]
for i in range(1,hang):
    hanglie=[]
    for j in range(1,lie):
        hanglie.append(sheet.cell_value(i,j))
    datam.append(hanglie)       
print(datam)
#列表推导式法_得到所有的值,按照行列排列,第一行j个数,第2行j个数。
hanglie=[sheet.cell_value(i,j) for i in range(1,hang) for j in range(1,lie)] #得到所有ij的值
stats = [[sheet.cell_value(r,c) for c in range(1,sheet.ncols)] for r in range(1,sheet.nrows)]#得到所有行列值
stats_frame=pd.DataFrame(stats)
normalizer=preprocessing.scale(stats_frame)
stats_frame_nomalized=pd.DataFrame(normalizer)
print(stats_frame)
print(stats_frame_nomalized)


z=linkage(stats,"average",metric='euclidean',optimal_ordering=True)
print(z)
# average=类平均法,ward=离差平方和法,sin=最短距离法,com=最长距离法,med=中间距离法,cen=重心法,fle=可变类平均法
fig, ax = plt.subplots(figsize=(10,9))
dendrogram(z, leaf_font_size=14) #画图
plt.title("Hierachial Clustering Dendrogram")
plt.xlabel("Cluster label")
plt.ylabel("Distance")
plt.axhline(y=4) #画一条分类线
plt.show()
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='average')
#linkage模式可以调整,n_cluser可以调整
print(cluster.fit_predict(stats))
plt.figure(figsize=(10, 7))  
plt.scatter(stats_frame[0],stats_frame[1], c=cluster.labels_)
plt.show()

 

数学建模专栏 - 聚类分析入门:基本概念和MATLAB实现

摘要:本文将介绍聚类分析的基本概念和MATLAB的实现方法。我们将先介绍聚类分析的概念和应用场景,然后介绍聚类算法的基本原理,最后用一个实际案例来演示如何使用MATLAB进行聚类分析。

1.简介

聚类分析是一种无监督学习方法,用于将数据集分成具有相似特征的不同群组。聚类分析广泛应用于各种领域,例如市场营销、社会网络分析、生物信息学等。在本文中,我们将介绍聚类分析的基本概念和MATLAB的实现方法。我们将用一个实际案例来演示如何使用MATLAB进行聚类分析。

2.聚类分析的基本概念

聚类分析是一种无监督学习方法,其目标是将数据集中的样本分成具有相似特征的不同群组。聚类分析的应用场景非常广泛,例如:

  • 市场营销:将消费者划分成具有相似购买行为的不同群组,以便进行精准营销;
  • 社会网络分析:将社交网络中的用户划分成具有相似兴趣爱好的不同群组,以便进行个性化推荐;
  • 生物信息学:将基因数据中的样本划分成具有相似表达谱的不同群组,以便进行基因功能注释。

在聚类分析中,样本通常由一组特征向量表示。我们可以将每个特征看作空间中的一个维度,然后根据样本在特征空间中的相似度将其分成不同的群组。聚类分析可以使用多种算法来实现,例如K均值聚类、层次聚类、密度聚类等。

3.聚类算法的基本原理

聚类算法是一种无监督学习方法,通过将数据集中的样本划分为若干个具有相似特征的群组,从而实现数据的分类。在聚类算法中,一个群组通常由一个或多个中心点(即聚类中心)表示,而样本与这些中心点之间的距离则用于确定样本属于哪个群组。常见的聚类算法包括K均值聚类、层次聚类、密度聚类等。

3.1 K均值聚类

K均值聚类是一种常见的聚类算法,其基本原理是将样本划分为K个群组,使得每个样本都属于距其最近的聚类中心对应的群组。在K均值聚类中,每个群组由其聚类中心表示,聚类中心的选择通常基于随机初始化或者手动指定。

以下是使用MATLAB实现K均值聚类的示例代码:

% 生成样本数据
X = [randn(100, 2)*0.75+ones(100, 2);
    randn(100, 2)*0.5-ones(100, 2)];

% 使用K均值聚类将数据分成2个群组
[idx, C] = kmeans(X, 2);

% 可视化聚类结果
figure;
gscatter(X(:,1), X(:,2), idx, 'rg');
hold on;
plot(C(:,1), C(:,2), 'kx', 'LineWidth', 2, 'MarkerSize', 10);
legend('Group 1', 'Group 2', 'Centroids');

在这段代码中,我们首先生成一个二维样本数据集。然后,我们使用MATLAB内置的kmeans函数将数据分成2个群组,并返回每个样本对应的群组编号以及每个群组的聚类中心。最后,我们使用gscatter函数绘制样本数据的散点图,并使用plot函数绘制每个群组的聚类中心。

3.2 层次聚类

层次聚类是一种将样本层层划分为不同群组的聚类算法,其基本原理是通过构建一棵树(即树状图)来表示数据的聚类层次,树的每个节点表示一个群组,而叶子节点表示一个单独的样本。在层次聚类中,树状图的生成通常基于样本间的距离(例如欧氏距离、曼哈顿距离等)。

以下是使用MATLAB实现层次聚类的示例代码:

% 生成样本数据
X = [randn(50, 2)*0.5+ones(50, 2);
    randn(50, 2)*0.5-ones(50, 2)];

% 计算样本间的距离
D = pdist(X);

% 构建层次聚类树
Z = linkage(D, 'ward');

% 将树状图可视化
figure;
[H, T, outperm] = dendrogram(Z);
set(H, 'LineWidth', 2);
set(gca, 'XTickLabel', '');
ylabel('Distance');

在这段代码中,我们首先生成一个二维样本数据集。然后,我们使用MATLAB内置的pdist函数计算样本间的距离,并使用linkage函数基于样本距离构建一个凝聚式层次聚类树。最后,我们使用dendrogram函数将树状图可视化,并调整标签和线条宽度以便于查看。

通过这个例子,我们可以看到,凝聚式层次聚类可以帮助我们了解样本之间的相似度,同时也可以帮助我们确定样本分组的数量。

3.3 密度聚类

密度聚类是一种基于样本密度的聚类算法,其基本原理是将密度较高的区域划分为一个群组,而密度较低的区域则被视为噪声或边缘点。在密度聚类中,每个样本都被视为一个群组,而群组的合并则基于样本之间

的距离和密度阈值。

以下是使用MATLAB实现基于密度聚类的示例代码:

% 生成样本数据
X = [randn(50, 2)*0.5+ones(50, 2);
    randn(50, 2)*0.5-ones(50, 2)];

% 使用DBSCAN算法进行密度聚类
[idx, C] = dbscan(X, 0.5, 5);

% 可视化聚类结果
figure;
gscatter(X(:,1), X(:,2), idx, 'rgbcmyk');
hold on;
plot(C(:,1), C(:,2), 'kx', 'LineWidth', 2, 'MarkerSize', 10);
legend('Group 1', 'Group 2', 'Group 3', 'Centroids');

在这段代码中,我们首先生成一个二维样本数据集。然后,我们使用MATLAB内置的dbscan函数将数据分成不同的密度群组,并返回每个样本对应的群组编号以及每个群组的聚类中心。最后,我们使用gscatter函数绘制样本数据的散点图,并使用plot函数绘制每个群组的聚类中心。

4.总结

本文介绍了聚类分析的基本概念和MATLAB的实现方法。我们首先介绍了聚类分析的应用场景,然后讨论了聚类算法的基本原理,包括K均值聚类、层次聚类和密度聚类。最后,我们用一个实际案例演示了如何使用MATLAB进行聚类分析。希望本文能够帮助读者了解聚类分析的基本原理和MATLAB的实现方法,同时也希望读者可以根据自己的实际应用场景,选择合适的聚类算法进行数据分析和处理。

以下是两个常见的难度较高的聚类案例,并附上MATLAB代码供参考。

  1. 基于文本的聚类分析

基于文本的聚类分析是一种将文本数据进行聚类的方法,其主要思想是将文本数据转化为高维向量,然后使用聚类算法对这些向量进行分组。在这个过程中,需要注意文本向量化的方法以及如何选择合适的聚类算法。

以下是使用MATLAB实现基于文本的聚类分析的示例代码:

% 加载文本数据
data = readtable('news.csv');
documents = data.article;

% 对文本数据进行向量化
cv = countVectorizer('StopWords', 'english');
X = cv.fit(documents);
X = X.transform(documents);

% 使用谱聚类对文本数据进行聚类
S = affinityMatrix(X);
D = diag(sum(S, 2));
L = D - S;
[eigVec, eigVal] = eig(L);
[~, idx] = sort(eigVal(1:end-1, 1));
U = eigVec(:, idx(1:3));
U = normr(U);
[idx, C] = kmeans(U, 3);

% 可视化聚类结果
figure;
gscatter(U(:,1), U(:,2), idx, 'rgb');
hold on;
plot(C(:,1), C(:,2), 'kx', 'LineWidth', 2, 'MarkerSize', 10);
legend('Group 1', 'Group 2', 'Group 3', 'Centroids');

在这段代码中,我们首先加载文本数据并使用MATLAB内置的countVectorizer函数将文本数据向量化。然后,我们使用谱聚类对文本数据进行聚类,并返回每个样本对应的群组编号以及每个群组的聚类中心。最后,我们使用gscatter函数绘制文本数据的散点图,并使用plot函数绘制每个群组的聚类中心。

  1. 基于图像的聚类分析

基于图像的聚类分析是一种将图像数据进行聚类的方法,其主要思想是将图像数据转化为高维向量,然后使用聚类算法对这些向量进行分组。在这个过程中,需要注意图像向量化的方法以及如何选择合适的聚类算法。

以下是使用MATLAB实现基于图像的聚类分析的示例代码:

% 加载图像数据
imds = imageDatastore('flower_photos', 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
numImages = numel(imds.Files);

% 对图像数据进行向量化
X = zeros(numImages, 128*128);
for i = 1:numImages
    img = readimage(imds, i);
    img = rgb2gray(img);
    img = imresize(img, [128, 128]);
    X(i,:) = img(:)';
end

% 使用谱聚类对图像数据进行

基于图像的聚类分析是一种将图像数据进行聚类的方法,其主要思想是将图像数据转化为高维向量,然后使用聚类算法对这些向量进行分组。在这个过程中,需要注意图像向量化的方法以及如何选择合适的聚类算法。

以下是使用MATLAB实现基于图像的聚类分析的示例代码:

  1. 加载和处理图像数据

在进行图像聚类之前,我们首先需要加载和处理图像数据。这里以一组鲜花图像为例,展示如何将图像转化为向量并进行聚类分析。代码如下:

% 加载图像数据
imds = imageDatastore('flower_photos', 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
numImages = numel(imds.Files);

% 对图像数据进行向量化
X = zeros(numImages, 128*128);
for i = 1:numImages
    img = readimage(imds, i);
    img = rgb2gray(img);
    img = imresize(img, [128, 128]);
    X(i,:) = img(:)';
end

在这段代码中,我们首先使用imageDatastore函数加载鲜花图像数据,该函数会将所有图像数据存储到一个MATLAB内置的数据结构中。然后,我们循环遍历每张图像,将其转化为灰度图像并将其大小调整为128*128像素,最后将图像数据转化为向量形式,并存储到一个矩阵中。

  1. 进行聚类分析

在将图像数据向量化后,我们可以使用MATLAB中提供的聚类算法对这些向量进行分组。这里以谱聚类算法为例,代码如下:

% 使用谱聚类对图像数据进行聚类
S = affinityMatrix(X);
D = diag(sum(S, 2));
L = D - S;
[eigVec, eigVal] = eig(L);
[~, idx] = sort(eigVal(1:end-1, 1));
U = eigVec(:, idx(1:3));
U = normr(U);
[idx, C] = kmeans(U, 5);

在这段代码中,我们首先使用affinityMatrix函数计算图像数据之间的相似度矩阵,然后通过计算矩阵的拉普拉斯矩阵,使用谱聚类算法对图像数据进行聚类分析。最后,我们使用kmeans算法将聚类结果进行进一步的分组,kmeans算法的输出结果包括每个样本所属的群组编号以及每个群组的聚类中心。

  1. 可视化聚类结果

聚类分析的最终目的是将数据划分为不同的群组,并展示这些群组之间的差异和相似度。在这个例子中,我们可以使用MATLAB的图像处理工具箱和可视化工具箱来可视化聚类结果。代码如下:

% 可视化聚类结果
figure;
for i = 1:5
    subplot(2, 3, i);
    idx_i = (idx == i);
    X_i = X(idx_i, :);
    [~, I] = min(pdist2(C(i,:), U));
    img_i = reshape(X_i(I,:), [128, 128]);
    imshow(img_i);
    title(sprintf('Group %d', i));
end

在这段代码中,我们首先创建一个图像窗口,并循环遍历每个群组,将属于该群组的图像取出并绘制在图像窗口中。其中,我们使用pdist2函数计算每个群组的聚类中心与样本数据之间的距离,然后选择与聚类中心距离最近的样本数据作为该群组的代表图像进行可视化展示。

  1. 总结

本文介绍了基于图像的聚类分析的基本原理和MATLAB的实现方法。我们首先加载和处理了鲜花图像数据,并将图像转化为向量形式。然后,我们使用谱聚类算法对图像数据进行聚类分析,并使用kmeans算法对聚类结果进行进一步的分组。最后,我们使用MATLAB的图像处理工具箱和可视化工具箱可视化聚类结果,展示了不同群组之间的差异和相似度。希望本文能够帮助读者了解基于图像的聚类分析的基本原理和MATLAB的实现方法,同时也希望读者可以根据自己的实际应用场景,选择合适的聚类算法进行图像数据分析和处理。

以上是关于数学建模聚类分析——python实现的主要内容,如果未能解决你的问题,请参考以下文章

建议收藏!10 种 Python 聚类算法完整操作示例

数据挖掘-聚类分析(Python实现K-Means算法)

看完这篇文章,包你懂得如何用Python实现聚类算法的层次算法!

10种Python聚类算法完整操作示例(建议收藏)

python数据分析与挖掘学习笔记-公司客户价值判断分析与聚类算法

机器学习强基计划7-2:图文详解K-均值聚类(K-means)算法(附Python实现)