人工智能和机器学习之聚类算法:亲和传播(Affinity Propagation):人工智能和机器学习概论_第1页
人工智能和机器学习之聚类算法:亲和传播(Affinity Propagation):人工智能和机器学习概论_第2页
人工智能和机器学习之聚类算法:亲和传播(Affinity Propagation):人工智能和机器学习概论_第3页
人工智能和机器学习之聚类算法:亲和传播(Affinity Propagation):人工智能和机器学习概论_第4页
人工智能和机器学习之聚类算法:亲和传播(Affinity Propagation):人工智能和机器学习概论_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

人工智能和机器学习之聚类算法:亲和传播(AffinityPropagation):人工智能和机器学习概论1引言1.1聚类算法在人工智能中的应用聚类算法是无监督学习的重要组成部分,广泛应用于人工智能领域,如图像识别、文本分析、市场细分、生物信息学等。通过将数据集中的样本分组到不同的簇中,聚类算法能够揭示数据的内在结构和模式,为后续的分析和决策提供有价值的信息。1.2亲和传播算法的简介亲和传播(AffinityPropagation)是一种基于消息传递的聚类算法,由Frey和Dueck在2007年提出。与传统的聚类算法如K-means不同,亲和传播不需要预先指定簇的数量,而是通过数据点之间的相似度来确定簇的中心点。算法的核心思想是将数据点视为“发送者”和“接收者”,通过在这些点之间传递“责任”和“可用性”消息来确定最佳的簇中心。1.2.1原理相似度矩阵:首先,计算数据点之间的相似度,形成一个相似度矩阵。相似度可以是点对点的距离的负数,也可以是点对点的亲和力。消息传递:责任(Responsibility):表示数据点i成为数据点j的簇中心的合适程度。可用性(Availability):表示数据点j成为簇中心的合适程度,受到其他数据点对j的簇中心选择的影响。迭代更新:算法通过迭代更新责任和可用性消息,直到收敛,即数据点之间的消息不再显著变化。确定簇中心:最终,那些具有最高可用性的数据点被选为簇中心,从而完成聚类。1.2.2示例代码下面是一个使用Python和scikit-learn库的亲和传播聚类算法的示例:importnumpyasnp

fromsklearn.clusterimportAffinityPropagation

fromsklearn.datasetsimportmake_blobs

#生成数据

X,_=make_blobs(n_samples=300,centers=4,cluster_std=0.6,random_state=0)

#初始化亲和传播算法

af=AffinityPropagation(damping=0.5,max_iter=200,convergence_iter=15,preference=None)

#拟合数据

af.fit(X)

#获取簇中心

cluster_centers_indices=af.cluster_centers_indices_

n_clusters=len(cluster_centers_indices)

#打印结果

print(f'Numberofdetectedclusters:{n_clusters}')

print(f'Clustercentersindices:{cluster_centers_indices}')

#可视化结果

importmatplotlib.pyplotasplt

plt.scatter(X[:,0],X[:,1],c=af.labels_,cmap='viridis')

plt.scatter(X[cluster_centers_indices,0],X[cluster_centers_indices,1],c='red',marker='x')

plt.title('AffinityPropagationClustering')

plt.show()1.2.3数据样例在上述代码中,我们使用了make_blobs函数生成了300个样本,这些样本分布在4个中心周围,标准差为0.6。这是一个典型的数据集,用于测试聚类算法的性能。1.2.4解释在代码示例中,我们首先生成了一个包含300个样本的数据集,这些样本分布在4个不同的中心周围。然后,我们初始化了AffinityPropagation类,设置了算法的参数,如damping(阻尼系数)和max_iter(最大迭代次数)。通过调用fit方法,算法开始迭代更新责任和可用性消息,直到收敛。最后,我们通过cluster_centers_indices_属性获取了簇中心的索引,并使用matplotlib库可视化了聚类结果,其中不同的颜色代表不同的簇,红色的“X”标记表示簇中心。通过这个示例,我们可以看到亲和传播算法如何自动确定簇的数量,并找到数据集中的簇中心,而无需人为干预。这种特性使得亲和传播在处理未知数据结构的场景中非常有用。2亲和传播算法原理2.1相似度度量亲和传播算法(AffinityPropagation)的核心在于它如何度量数据点之间的相似度。在算法开始之前,我们首先需要计算一个相似度矩阵,这个矩阵反映了数据集中任意两个点之间的相似度。相似度可以基于多种度量标准,如欧氏距离、余弦相似度等,但亲和传播算法通常使用负的欧氏距离平方作为相似度度量,即:s其中,xi和xk是数据集中的两个点,2.1.1示例代码假设我们有以下数据集:importnumpyasnp

#示例数据集

data_points=np.array([[1,2],[1,4],[1,0],

[4,2],[4,4],[4,0]])我们可以计算相似度矩阵:#计算相似度矩阵

defcalculate_similarity(data):

"""

计算数据集中任意两个点之间的相似度矩阵。

使用负的欧氏距离平方作为相似度度量。

"""

similarities=np.zeros((data.shape[0],data.shape[0]))

foriinrange(data.shape[0]):

forkinrange(data.shape[0]):

similarities[i,k]=-np.linalg.norm(data[i]-data[k])**2

returnsimilarities

#输出相似度矩阵

print(calculate_similarity(data_points))2.2消息传递机制亲和传播算法通过消息传递机制来确定数据点之间的关系,从而找到聚类中心。算法中涉及两种类型的消息:责任(Responsibility)和可用性(Availability)。责任:表示数据点i成为数据点k的聚类中心的合适程度。责任值高意味着数据点i是数据点k的优秀聚类中心候选。可用性:表示数据点k可以接受数据点i作为其聚类中心的程度。可用性值高意味着数据点i是一个好的聚类中心选择。算法通过迭代更新这些消息,直到达到收敛状态,即数据点之间的责任和可用性消息不再显著变化。2.2.1示例代码在Python中,我们可以使用sklearn库中的AffinityPropagation类来实现亲和传播算法。以下是一个使用AffinityPropagation进行聚类的示例:fromsklearn.clusterimportAffinityPropagation

#使用亲和传播算法进行聚类

af=AffinityPropagation(damping=0.5,max_iter=200,convergence_iter=15,preference=None)

af.fit(data_points)

#输出聚类中心

cluster_centers_indices=af.cluster_centers_indices_

print("聚类中心索引:",cluster_centers_indices)

#输出每个点所属的聚类

labels=af.labels_

print("每个点的聚类标签:",labels)2.3责任和可用性概念在亲和传播算法中,责任和可用性是两个关键概念,它们通过以下公式进行更新:责任:R可用性:A其中,Ri,k表示数据点i对数据点k的责任,A2.3.1示例代码虽然sklearn库中的AffinityPropagation类内部实现了责任和可用性的更新,但为了更好地理解算法,我们可以手动实现这些更新过程。以下是一个简单的示例,展示了如何手动更新责任和可用性:importnumpyasnp

#初始化责任和可用性矩阵

responsibilities=np.zeros((data_points.shape[0],data_points.shape[0]))

availabilities=np.zeros((data_points.shape[0],data_points.shape[0]))

#责任和可用性的更新

defupdate_messages(similarities,responsibilities,availabilities):

"""

更新责任和可用性矩阵。

"""

#更新责任

foriinrange(similarities.shape[0]):

forkinrange(similarities.shape[0]):

ifi!=k:

responsibilities[i,k]=similarities[i,k]-np.max(availabilities[i]+similarities[i])

#更新可用性

foriinrange(similarities.shape[0]):

forkinrange(similarities.shape[0]):

ifi!=k:

sum_positive_responsibilities=np.sum(np.maximum(0,responsibilities[:,k]))

availabilities[i,k]=min(0,responsibilities[k,k]+sum_positive_responsibilities)

#迭代更新

for_inrange(100):

update_messages(similarities,responsibilities,availabilities)

#输出最终的责任和可用性矩阵

print("最终责任矩阵:\n",responsibilities)

print("最终可用性矩阵:\n",availabilities)通过上述代码,我们可以看到责任和可用性矩阵如何随着迭代而更新,最终帮助我们确定数据集中的聚类中心。亲和传播算法的独特之处在于它能够自动确定聚类的数量,而不需要像K-means算法那样预先设定。这使得亲和传播算法在处理未知聚类数量的数据集时非常有用。3亲和传播算法步骤3.1初始化相似度矩阵亲和传播(AffinityPropagation)算法是一种基于消息传递的聚类技术,它不需要预先设定聚类的数量,而是通过数据点之间的相似度来确定聚类中心。在算法的开始,我们需要构建一个相似度矩阵,这个矩阵反映了数据点之间的相似度。相似度矩阵的构建通常基于数据点之间的距离或相关性。例如,如果我们使用欧几里得距离作为相似度度量,相似度矩阵中的元素可以定义为:s其中,si,k表示数据点i和数据点k之间的相似度,x3.1.1示例代码假设我们有以下数据点:data_points=[

[1,2],

[1.5,1.8],

[5,8],

[8,8],

[1,0.6],

[9,11]

]我们可以使用以下代码来构建相似度矩阵:importnumpyasnp

#数据点

data_points=np.array([

[1,2],

[1.5,1.8],

[5,8],

[8,8],

[1,0.6],

[9,11]

])

#计算相似度矩阵

defcalculate_similarity_matrix(data):

n=data.shape[0]

similarity_matrix=np.zeros((n,n))

foriinrange(n):

forkinrange(n):

similarity_matrix[i,k]=-np.linalg.norm(data[i]-data[k])**2

returnsimilarity_matrix

#初始化相似度矩阵

similarity_matrix=calculate_similarity_matrix(data_points)

print(similarity_matrix)3.2消息更新过程在初始化相似度矩阵后,亲和传播算法通过消息传递来确定聚类中心。算法中涉及两种类型的消息:责任(Responsibility)和可用性(Availability)。责任:表示数据点i选择数据点k作为其聚类中心的合适程度。可用性:表示数据点k作为聚类中心的合适程度,考虑到其他数据点对k的选择。算法通过迭代更新这些消息,直到达到收敛状态。在每次迭代中,责任和可用性消息都会根据以下公式进行更新:ra3.2.1示例代码在Python中,我们可以使用以下代码来实现消息更新过程:#责任和可用性消息初始化

responsibility=np.zeros((n,n))

availability=np.zeros((n,n))

#消息更新函数

defupdate_messages():

globalresponsibility,availability

#更新责任消息

foriinrange(n):

forkinrange(n):

ifi!=k:

responsibility[i,k]=similarity_matrix[i,k]-np.max(similarity_matrix[i,[xforxinrange(n)ifx!=k]])

#更新可用性消息

foriinrange(n):

forkinrange(n):

ifi!=k:

availability[i,k]=np.min([0,responsibility[k,k]+np.sum(np.max([0,responsibility[[xforxinrange(n)ifx!=k],k]])]

#检查收敛

ifnp.allclose(old_responsibility,responsibility)andnp.allclose(old_availability,availability):

returnFalse

else:

old_responsibility=responsibility.copy()

old_availability=availability.copy()

returnTrue

#迭代更新消息

old_responsibility=responsibility.copy()

old_availability=availability.copy()

whileupdate_messages():

pass3.3聚类中心确定当消息传递过程收敛后,我们可以通过检查最终的责任和可用性消息来确定聚类中心。数据点k如果同时满足以下条件,就被认为是聚类中心:k的数据点的责任rkk的数据点的可用性ak3.3.1示例代码确定聚类中心的代码如下:#确定聚类中心

defdetermine_exemplars():

exemplars=[]

forkinrange(n):

ifresponsibility[k,k]>0andavailability[k,k]>0:

exemplars.append(k)

returnexemplars

#聚类中心

exemplars=determine_exemplars()

print("聚类中心:",exemplars)通过上述步骤,我们可以使用亲和传播算法对数据进行聚类,而无需预先设定聚类的数量。这种方法特别适用于数据点间相似度不均匀或聚类数量未知的情况。4亲和传播算法的优缺点4.1算法的优点分析亲和传播(AffinityPropagation,AP)算法是一种基于消息传递的聚类算法,它能够从数据中自动确定聚类中心的数量,而不需要预先设定。这一特性使得AP算法在处理未知数据结构时具有显著优势。以下是AP算法的几个主要优点:自动确定聚类中心数量:AP算法通过数据点之间的相似度来确定聚类中心,这意味着算法能够根据数据的内在结构自动调整聚类的数量,无需用户手动设定。鲁棒性:AP算法对噪声和异常值具有较好的鲁棒性。由于算法基于数据点之间的相似度,异常值对聚类结果的影响相对较小。可解释性:AP算法通过消息传递机制来确定聚类中心,这一过程可以被直观地理解和解释,使得算法的决策过程更加透明。适用于非球形数据:与K-means等算法相比,AP算法能够更好地处理非球形分布的数据,因为它不假设数据点在每个聚类中均匀分布。并行化处理:AP算法的消息传递过程可以并行化,这在处理大规模数据集时可以显著提高算法的效率。4.1.1示例代码假设我们有一组二维数据点,我们将使用Python的sklearn库中的AffinityPropagation类来实现AP算法。importnumpyasnp

fromsklearn.clusterimportAffinityPropagation

fromsklearn.datasetsimportmake_blobs

importmatplotlib.pyplotasplt

#生成数据

X,_=make_blobs(n_samples=300,centers=4,cluster_std=0.6,random_state=0)

#初始化AP算法

ap=AffinityPropagation(damping=0.5,max_iter=200,convergence_iter=15,preference=None)

#拟合数据

ap.fit(X)

#获取聚类中心

cluster_centers=ap.cluster_centers_

#获取每个数据点的聚类标签

labels=ap.labels_

#可视化结果

plt.scatter(X[:,0],X[:,1],c=labels,s=50,cmap='viridis')

plt.scatter(cluster_centers[:,0],cluster_centers[:,1],c='red',s=200,alpha=0.5)

plt.title('AffinityPropagationClustering')

plt.show()4.2算法的局限性探讨尽管AP算法具有上述优点,但它也存在一些局限性,这些局限性可能在某些场景下限制了算法的适用性:计算复杂度:AP算法的计算复杂度较高,尤其是在数据量较大的情况下。算法需要计算所有数据点之间的相似度矩阵,这在大规模数据集上可能变得非常耗时。参数敏感性:AP算法的性能受参数选择的影响较大,尤其是damping和preference参数。不合适的参数设置可能导致聚类结果不佳。内存需求:由于需要存储所有数据点之间的相似度矩阵,AP算法在内存需求上也较高,这限制了它在处理大规模数据集时的实用性。对相似度度量的依赖:AP算法的性能高度依赖于数据点之间的相似度度量。如果相似度度量选择不当,可能会影响聚类结果的准确性。可能产生过多的聚类中心:在某些情况下,AP算法可能会产生过多的聚类中心,这需要额外的后处理步骤来合并相似的聚类中心。4.2.1示例数据与代码为了展示AP算法在不同参数设置下的表现,我们使用相同的二维数据集,但改变damping和preference参数,观察聚类结果的变化。#使用不同的参数设置

ap1=AffinityPropagation(damping=0.5,preference=-50)

ap2=AffinityPropagation(damping=0.9,preference=-100)

#拟合数据

ap1.fit(X)

ap2.fit(X)

#获取聚类中心和标签

cluster_centers1=ap1.cluster_centers_

labels1=ap1.labels_

cluster_centers2=ap2.cluster_centers_

labels2=ap2.labels_

#可视化结果

plt.figure(figsize=(12,6))

plt.subplot(1,2,1)

plt.scatter(X[:,0],X[:,1],c=labels1,s=50,cmap='viridis')

plt.scatter(cluster_centers1[:,0],cluster_centers1[:,1],c='red',s=200,alpha=0.5)

plt.title('APwithdamping=0.5,preference=-50')

plt.subplot(1,2,2)

plt.scatter(X[:,0],X[:,1],c=labels2,s=50,cmap='viridis')

plt.scatter(cluster_centers2[:,0],cluster_centers2[:,1],c='red',s=200,alpha=0.5)

plt.title('APwithdamping=0.9,preference=-100')

plt.show()通过调整damping和preference参数,我们可以观察到聚类结果的变化,这说明了AP算法对参数选择的敏感性。在实际应用中,可能需要通过交叉验证等方法来确定最佳的参数设置。5亲和传播算法的应用案例5.1图像分割亲和传播算法在图像分割中有着广泛的应用,它能够有效地识别图像中的不同区域,从而实现精准的分割。图像分割是计算机视觉中的一个关键步骤,用于将图像划分为多个具有相似特征的区域,如颜色、纹理或形状。AffinityPropagation通过构建像素之间的相似度矩阵,然后利用这些相似度来传播信息,最终确定哪些像素应该被归类到同一区域。5.1.1示例:使用亲和传播进行图像分割假设我们有一张包含不同颜色区域的图像,我们将使用亲和传播算法来分割这些区域。importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.clusterimportAffinityPropagation

fromsklearn.datasetsimportmake_blobs

fromsklearn.preprocessingimportStandardScaler

#生成图像数据

centers=[[1,1],[-1,-1],[1,-1]]

X,labels_true=make_blobs(n_samples=300,centers=centers,cluster_std=0.5,

random_state=0)

#标准化数据

X=StandardScaler().fit_transform(X)

#构建亲和传播模型

af=AffinityPropagation(damping=0.9,preference=-200)

af.fit(X)

#获取聚类中心和标签

cluster_centers_indices=af.cluster_centers_indices_

labels=af.labels_

#绘制图像分割结果

plt.figure(figsize=(10,5))

plt.scatter(X[:,0],X[:,1],c=labels,cmap='viridis')

#标记聚类中心

plt.scatter(X[cluster_centers_indices,0],X[cluster_centers_indices,1],

c='red',marker='x',s=200,linewidths=3)

plt.title('图像分割结果')

plt.show()在这个例子中,我们首先生成了包含三个中心的图像数据,然后使用StandardScaler对数据进行标准化处理,以确保算法在处理数据时不会受到特征尺度的影响。接下来,我们创建了一个AffinityPropagation模型,并设置了damping和preference参数。damping参数控制信息传播过程中的阻尼效应,而preference参数则影响算法选择聚类中心的倾向。最后,我们绘制了图像分割的结果,可以看到不同颜色的区域被成功地分割开来。5.2生物信息学中的应用在生物信息学领域,亲和传播算法被用于分析基因表达数据,识别蛋白质相互作用网络中的模块,以及在基因组学中发现基因簇。这些应用通常涉及到高维数据和复杂的相互关系,AffinityPropagation能够有效地处理这些问题,因为它不需要预先设定聚类的数量,而是根据数据的亲和度自动确定。5.2.1示例:使用亲和传播分析基因表达数据假设我们有一组基因表达数据,我们将使用亲和传播算法来识别基因表达模式中的聚类。importpandasaspd

fromsklearn.clusterimportAffinityPropagation

fromsklearn.metricsimportsilhouette_score

#加载基因表达数据

data=pd.read_csv('gene_expression_data.csv')

#提取表达值

X=data.iloc[:,1:].values

#构建亲和传播模型

af=AffinityPropagation(damping=0.5,preference=-50)

af.fit(X)

#获取聚类标签

labels=af.labels_

#计算轮廓系数

score=silhouette_score(X,labels)

#输出聚类结果和轮廓系数

print("聚类结果:",labels)

print("轮廓系数:",score)在这个例子中,我们首先加载了一组基因表达数据,然后提取了表达值作为特征。接下来,我们创建了一个AffinityPropagation模型,并使用它来拟合数据。最后,我们计算了轮廓系数,这是一个评估聚类效果的指标,值越接近1表示聚类效果越好。通过这种方式,我们可以识别出基因表达数据中的不同模式或簇。通过上述两个应用案例,我们可以看到亲和传播算法在处理图像分割和生物信息学数据时的强大能力。它不仅能够自动确定聚类的数量,还能有效地处理高维和复杂的数据结构,为数据分析和模式识别提供了有力的工具。6实践与代码实现6.1Python中实现亲和传播算法亲和传播算法(AffinityPropagation)是一种基于消息传递的聚类技术,它能够从数据中确定聚类中心,而无需事先指定聚类的数量。该算法通过在数据点之间传递“责任”和“可用性”消息来确定聚类中心,其中“责任”消息表示数据点成为其他点聚类中心的可能性,“可用性”消息表示数据点被选为聚类中心的可能性。6.1.1数据准备假设我们有以下数据点,我们将使用这些点来演示亲和传播算法:importnumpyasnp

#示例数据点

X=np.array([[1,2],[1,4],[1,0],

[4,2],[4,4],[4,0],

[6,2],[6,4],[6,0]])6.1.2实现亲和传播算法在Python中,我们可以使用scikit-learn库中的AffinityPropagation类来实现亲和传播算法。以下是一个使用scikit-learn进行亲和传播聚类的示例:fromsklearn.clusterimportAffinityPropagation

#创建AffinityPropagation实例

af=AffinityPropagation(damping=0.5,max_iter=200,convergence_iter=15,preference=None)

#拟合数据

af.fit(X)

#获取聚类中心

cluster_centers_indices=af.cluster_centers_indices_

n_clusters_=len(cluster_centers_indices)

print('聚类中心索引:',cluster_centers_indices)

print('聚类数量:',n_clusters_)6.1.3解释代码导入必要的库:我们首先导入numpy用于数据处理,以及scikit-learn中的AffinityPropagation类用于算法实现。数据准备:我们创建了一个numpy数组X,其中包含了示例数据点。创建AffinityPropagation实例:我们使用AffinityPropagation类创建一个实例,其中damping参数控制消息更新的阻尼程度,max_iter和convergence_iter分别控制最大迭代次数和收敛所需的迭代次数,preference参数可以用来调整数据点成为聚类中心的倾向。拟合数据:通过调用fit方法,我们让算法学习数据并确定聚类中心。获取聚类中心:我们通过cluster_centers_indices_属性获取聚类中心的索引,以及通过n_clusters_属性获取聚类的数量。6.2使用Scikit-Learn进行亲和传播聚类6.2.1安装Scikit-Learn确保你的环境中已经安装了scikit-learn库。如果没有安装,可以通过以下命令安装:pipinstall-Uscikit-learn6.2.2代码示例下面的代码示例展示了如何使用scikit-learn的AffinityPropagation类对数据进行聚类:importmatplotlib.pyplotasplt

fromsklearnimportdatasets

fromsklearn.clusterimportAffinityPropagation

#加载数据集

iris=datasets.load_iris()

X=iris.data

#创建AffinityPropagation实例

af=AffinityPropagation(damping=0.9,preference=-200)

af.fit(X)

#获取聚类中心和聚类标签

cluster_centers_indices=af.cluster_centers_indices_

labels=af.labels_

#绘制聚类结果

plt.figure(figsize=(8,6))

plt.scatter(X[:,0],X[:,1],c=labels,cmap='viridis')

plt.scatter(X[cluster_centers_indices,0],X[cluster_centers_indices,1],c='red',marker='x')

plt.title('亲和传播聚类结果')

plt.show()6.2.3解释代码加载数据集:我们使用scikit-learn自带的iris数据集,这是一个常用的数据集,包含150个样本,每个样本有4个特征。创建AffinityPropagation实例:我们调整了damping和preference参数,以优化算法的性能。拟合数据:通过调用fit方法,算法学习数据并确定聚类中心。获取聚类中心和聚类标签:我们通过cluster_centers_indices_和labels_属性获取聚类中心的索引和每个数据点的聚类标签。绘制聚类结果:我们使用matplotlib库来可视化聚类结果,其中数据点根据其聚类标签着色,聚类中心用红色的‘x’标记。通过以上步骤,我们可以看到亲和传播

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论