计算智能——K均值与模糊C均值对比学习

一.关于聚类分析

1.1什么是聚类分析

聚类分析的主要目的是通过对数据集的合理划分来发现数据集的特征结构。利用聚类结果,我们能够提取数据集中隐藏的信息,对未来数据进行预测和分类。由聚类所生成的类或簇是一组数据对象的集合,且同类中的对象彼此相似不同类间的对象彼此相异,是一种无监督学习的过程。

1.2聚类分析中的数据类型

连续型:
属性两个不同取值之间有无数多个其他取值,例如温度,高度等。这一类型的属性通常用数值(实数或整数)来表示,又称定量型变量

离散型:
属性的取值是有限个,例如人的性别和民族等。这一类型的属性通常用有限个状态的字母,符号表示,但也可以是一组数值(如部分整数),又称定性型变量

关联型:
源数据集只提供两个不同样本之间的相互关联关系,如相似度或距离等信息,通常用n*n维的矩阵来表示。

混合型:即属性取值类型包括以上各种数据类型,这种类型的数据在实际中也经常出现,相对来说,这种类型数据的处理也比较复杂。大多数混合型数据是指连续型和离散型数据的混合,即数值型和名词型数据的混合,而与关联型数据的混合较少。

1.3聚类模型

一般对聚类模型的设计有两大类:
基于层次的模型:
从树状图的角度来描述数据。
基于划分的模型:
从类原型的角度来描述数据。

上述两种类型的聚类算法设计内容通常包括三个方面:
1.样本与类间距离(相似度)的定义
2.聚类形成过程中的调整策略
3.聚类结束所需要满足的条件

K-均值和模糊C均值是对连续型数据基于划分进行的聚类方法。

1.4K均值与模糊C均值的异同

相同:
这两个方法都是迭代求取最终的聚类划分,即聚类中心隶属度值。两者都不能保证找到问题的最优解,都有可能收敛到局部极值。

相异:
K均值:
一种硬聚类算法,隶属度只有两个取值0或1,提出的基本根据是“类内误差平方和最小化”准则。

模糊C均值:
一种模糊聚类算法,是k均值聚类算法的推广形式,隶属度取值为[0 1]区间内的任何一个数,提出的基本根据是“类内加权误差平方和最小化”准则。

模糊C均值是K均值方法的改进,算法的目标函数与K均值一致,区别在于目标函数中增加了模糊权重指数。

二.数据收集

2.1数据问题背景

11个变量维度对白葡萄酒的质量进行分类。
样本个数:4898 个白葡萄酒样本

输入变量:

# 理化性质 字段名称
1 固定酸度 fixed acidity
2 挥发性酸度 volatile acidity
3 柠檬酸 citric acid
4 残糖 residual sugar
5 氯化物 chlorides
6 游离二氧化硫 free sulfur dioxide
7 总二氧化硫 total sulfur dioxide
8 密度 density
9 PH值 pH
10 硫酸盐 sulphates
11 酒精度 alcohol

输出变量:

# 理化性质 字段名称
1 葡萄酒的质量 quality

2.2数据来源

UCI网站筛选
https://archive.ics.uci.edu/ml/datasets/Wine+Quality

2.3数据描述

输入变量:
根据理化实验得出的具体实数值。

输出变量:
基于感官的数据评分:0(很不好)-10(很好)分

网站对数据的描述:
这些数据集可以看作是分类回归任务。等级是有序的,不平衡的(例如,普通葡萄酒比优质或劣质葡萄酒多得多)。离群点检测算法可用于检测少数优质或劣质葡萄酒。此外,我们不确定是否所有的输入变量都是相关的。因此,测试特征选择方法可能很有趣。

2.4如何将UCI数据转成MATLAB可用格式

参考:如何使用UCI数据集
我采用的是最常见的转成mat格式。

三.K-均值聚类

3.1原理

先预先指定聚类个数K。K均值算法将会初始给出K个随机聚类中心。为了得到“簇内距离小,簇间距离大”的聚类效果,K均值的做法是最终找到K个合适的聚类中心,来最小化平方误差:
在这里插入图片描述
为此K均值采取的是贪心的策略来求近似解,不断地把每个个体分配至距离它最近的那个聚类中心,然后移动每个聚类中心到它所代表的这个类的中心。然后算法重复:分配聚类中心,移动聚类中心。通过多次迭代来减小平方误差。

3.2算法

1.初始化K个聚类中心:
为了保证聚类中心位于确实有意义的位置,从样本中随机选择K个个体作为聚类中心。如果关于训练样本有一些先验知识,或已经预先知道了K个聚类中心的大概位置,也可以指定聚类中心位置。合适的初始设置将会极大改善最终聚类的效果,并提高聚类算法的效率。
注意:由于K均值算法的寻优采取的是贪心策略,较容易陷入局部最优,因此算法对于初始聚类中心的位置非常敏感,同样的训练样本集和同样的K,最终经常得到不同的聚类结果。
2为每个个体分配聚类中心
为了逐步减小平方误差值,我们为所有个体寻找到离它最近的聚类中心,并为此个体标注其所属的类。为下一步移动聚类中心至合适的位置打基础。
3.移动聚类中心
在设置完初始聚类中心后,每个簇内仅有一个个体,这是显然聚类中心就位于该簇的中心位置。但加入其他的个体后,聚类中心就需要移动其位置以保证自己位于簇的中心。
4.迭代
算法不断重复第2,3步,直到达到停止条件(用户设置的最大迭代次数,或者两次迭代并未改变聚类结果等)。

3.3实验过程及分析(重点)

代码一
用MATLAB自带的K均值函数根据11个属性来进行聚类
MATLAB自带K均值函数介绍
MATLAB函数Kmeans
使用方法:
[Idx,C,sumD,D]=Kmeans(X,K)
[…]=Kmeans(…,’Param1’,Val1,’Param2’,Val2,…)

各输入输出参数介绍:
输入
X: NP的数据矩阵,N为数据个数,P为单个数据维度
K: 表示将X划分为几类,为整数
输出
Idx: N
1的向量,存储的是每个点的聚类标号
C: KP的矩阵,存储的是K个聚类质心位置
sumD: 1
K的和向量,存储的是类间所有点与该类质心点距离之和
D: N*K的矩阵,存储的是每个点与所有质心的距离

[…]=Kmeans(…,‘Param1’,Val1,‘Param2’,Val2,…)
这其中的参数Param1、Param2等,主要可以设置为如下:

  1. ‘Distance’(距离测度)
    ‘sqEuclidean’ 欧式距离(默认时,采用此距离方式)
    ‘cityblock’ 绝度误差和,又称:L1
    ‘cosine’ 针对向量
    ‘correlation’ 针对有时序关系的值
    ‘Hamming’ 只针对二进制数据
  2. ‘Start’(初始质心位置选择方法)
    ‘sample’ 从X中随机选取K个质心点
    ‘uniform’ 根据X的分布范围均匀的随机生成K个质心
    ‘cluster’ 初始聚类阶段随机选择10%的X的子样本(此方法初始使用’sample’方法)
    matrix 提供一K*P的矩阵,作为初始质心位置集合
  3. ‘Replicates’(聚类重复次数) 整数
clc,clear;
load winequality-white;
X=winequalitywhite1;    %列向量变成行向量,4898*11矩阵
[x,y]=size(X);
opts = statset('Display','final');
K=3;           %将X划分为K类
repN=50;        %迭代次数
%K-mean聚类
[Idx,Ctrs,SumD,D] = kmeans(X,K,'Replicates',repN
  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我来为您解答。 首先,初始化一个4维向量可以使用Python的列表(list)来实现。例如,以下代码演示了如何创建一个包含4个0的向量: ``` vector = [0, 0, 0, 0] ``` 接下来,让我们来看一下如何使用K均值聚类算法实现对数据的聚类。K均值聚类是一种常用的无监督学习算法,它通过将数据分成K个不同的簇来实现聚类。 以下是使用Python实现K均值聚类的示例代码: ```python import numpy as np # 定义K均值聚类算法 def kmeans(X, k, max_iters=100): # 随机初始化质心 centroids = X[np.random.choice(range(len(X)), k)] for i in range(max_iters): # 计算每个样本到质心的距离 distances = np.sqrt(((X - centroids[:, np.newaxis]) ** 2).sum(axis=2)) # 找到距离每个样本最近的质心 closest_centroids = np.argmin(distances, axis=0) # 重新计算质心 for j in range(k): centroids[j] = X[closest_centroids == j].mean(axis=0) return centroids, closest_centroids # 测试K均值聚类算法 X = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]) k = 2 centroids, closest_centroids = kmeans(X, k) print("质心:", centroids) print("每个样本所属的簇:", closest_centroids) ``` 在上述代码中,我们使用了NumPy库来进行数据处理和计算。首先,我们随机初始化了K个质心,然后循环执行以下步骤: 1. 计算每个样本到质心的距离。 2. 找到距离每个样本最近的质心。 3. 重新计算质心。 重复上述步骤,直到算法收敛或达到最大迭代次数。 最后,我们输出了计算出的质心和每个样本所属的簇。 希望上述代码能帮到您,如有疑问请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值