isodata 聚类分析 实验报告 IRIS数据

详细文档:http://www.yiyehu.tech/archives/2019/05/26/isodata_report-2 ‎

ISODATA 算法汇报文档

实验介绍

实验:使用ISODATA聚类算法在IRIS数据上进行聚类分析
ISODATA(迭代自组织数据分析算法 )来自模糊数学领域 ,是统计模式识别 中非监督动态聚类算法的一种。

算法基本思想

可以通过类的自动合并(两 类合一)与分裂(一类分为二),得到较合理的 类型数目c。
算法步骤及实验过程

预处理IRIS数据
data = shuffle(data)
feature_scaling(data, numeric_attrs)
encode_values = data["Species"].unique()
encode_fill_attrs(data, "Species", encode_values)
data.to_csv(processed_data_path, index=False)

打乱IRIS数据的顺序,标准化,保存处理后的文件为process_data.csv。
从process_data.csv中读取文件

input_data_path = 'processed_data\\process_data.csv'
print("Loading data...")
column = ['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Species']
data = pd.read_csv(input_data_path, header=None, skiprows=[0, 0], sep=',', names=column)
第一步:初始化参数

初始化参数:预期聚类中心个数k、现聚类中心个数c、最少的样本数theta_n、聚类中心之间的最小距离theta_c、距离分布的标准差(阈值)theta_s、最大迭代次数iterator、分裂时样本特征聚类中心分裂参数split_k。

# 预期聚类中心
        self.k = 3
        # 现聚类中心
        self.category_num = 1
        # 每一类聚类中最少的样本数
        self.theta_n = 23
        # 一个聚类域中样本距离分布的标准差(阈值)
        self.theta_s = 0.12
        # 两个聚类中心之间的最小距离,如果小于次数,则合并
        self.theta_c = 1.2
        # 每次迭代允许合并的最大聚类对数目
        self.L = 1
        # 允许的最大迭代次数
        self.max_iterator = 100
        # 迭代次数
        self.iterator = 1
        # 分裂参数
        self.split_k = 0.5
第二步:计算每个样本与聚合中心距离

计算每个样本与聚合中心距离,并把所有样本划分到category_num个聚合中去。

for j in range(len(self.centre_data[i])):
    _, index = compute_min_distance(self.centre_data[i].iloc[j, :4], self.centre_pot)
    if i != index:
        self.centre_data[index] = self.centre_data[index].append(self.centre_data[i].iloc[j])
    else:
        temp_df = temp_df.append(self.centre_data[i].iloc[j])
self.centre_data[i] = temp_df

第三步:舍去小聚类中心

舍去样本数少于theta_n的聚类,并且把样本重新分配到其他聚类中去。在Isodata类中的reject方法里。
temp_set = self.centre_data[index]

删除子集
删除聚合中心
self.centre_pot.pop(index)
self.category_num -= 1
for j in range(len(temp_set)):
    _, index = compute_min_distance(temp_set.iloc[j, :4], self.centre_pot)
    self.centre_data[index] = self.centre_data[index].append(temp_set.iloc[j], ignore_index=True)
第四步计算修改聚合中心

每次更新聚类中心的样本后,都要对聚类中心更新。

def compute_centre(self):
    centre = []
    for j in range(len(self.centre_data)):
        centre.append(self.centre_data[j].iloc[:, :4].mean(axis=0))
    self.centre_pot = centre
第五六步:计算距离

计算类内距离平均值,计算类内总平均距离D(全部样本对其相应聚类中心的总平 均距离)。

第七步:判断是否需要分裂
第八步:计算最大标准偏差向量
第九步:最大标准偏差分量
第十步,根据条件进行分裂操作
第十一步:计算两两聚合中心间的距离
第十二步:比较两两聚合中心间的距离与theta_c
第十三步:合并聚类
第十四步 迭代
结果
分析

#代码还有待改进

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值