内容:

1.数据集:

(1)人工生成数据集AriGen:自己生成含有3个类别的二维数据集,且类别间线性分开,分别具有100·200与300个样本;

(2) Iris 数据集·

2.编写k-均值聚类算法程序,对人工生成数据集AriGen 与 Iris数据集进行聚类﹐并计算DB指数。

一、数据集(150)

具体数据如下(如果不能运行,尝试在末尾加回车)

5.1  3.5 1.4 0.2 1
4.9 3   1.4 0.2 1
4.7 3.2 1.3 0.2 1
4.6 3.1 1.5 0.2 1
5   3.6 1.4 0.2 1
5.4 3.9 1.7 0.4 1
4.6 3.4 1.4 0.3 1
5   3.4 1.5 0.2 1
4.4 2.9 1.4 0.2 1
4.9 3.1 1.5 0.1 1
5.4 3.7 1.5 0.2 1
4.8 3.4 1.6 0.2 1
4.8 3   1.4 0.1 1
4.3 3   1.1 0.1 1
5.8 4   1.2 0.2 1
5.7 4.4 1.5 0.4 1
5.4 3.9 1.3 0.4 1
5.1 3.5 1.4 0.3 1
5.7 3.8 1.7 0.3 1
5.1 3.8 1.5 0.3 1
5.4 3.4 1.7 0.2 1
5.1 3.7 1.5 0.4 1
4.6 3.6 1   0.2 1
5.1 3.3 1.7 0.5 1
4.8 3.4 1.9 0.2 1
5   3   1.6 0.2 1
5   3.4 1.6 0.4 1
5.2 3.5 1.5 0.2 1
5.2 3.4 1.4 0.2 1
4.7 3.2 1.6 0.2 1
4.8 3.1 1.6 0.2 1
5.4 3.4 1.5 0.4 1
5.2 4.1 1.5 0.1 1
5.5 4.2 1.4 0.2 1
4.9 3.1 1.5 0.1 1
5   3.2 1.2 0.2 1
5.5 3.5 1.3 0.2 1
4.9 3.1 1.5 0.1 1
4.4 3   1.3 0.2 1
5.1 3.4 1.5 0.2 1
5   3.5 1.3 0.3 1
4.5 2.3 1.3 0.3 1
4.4 3.2 1.3 0.2 1
5   3.5 1.6 0.6 1
5.1 3.8 1.9 0.4 1
4.8 3   1.4 0.3 1
5.1 3.8 1.6 0.2 1
4.6 3.2 1.4 0.2 1
5.3 3.7 1.5 0.2 1
5   3.3 1.4 0.2 1
7   3.2 4.7 1.4 2
6.4 3.2 4.5 1.5 2
6.9 3.1 4.9 1.5 2
5.5 2.3 4   1.3 2
6.5 2.8 4.6 1.5 2
5.7 2.8 4.5 1.3 2
6.3 3.3 4.7 1.6 2
4.9 2.4 3.3 1   2
6.6 2.9 4.6 1.3 2
5.2 2.7 3.9 1.4 2
5   2   3.5 1   2
5.9 3   4.2 1.5 2
6   2.2 4   1   2
6.1 2.9 4.7 1.4 2
5.6 2.9 3.6 1.3 2
6.7 3.1 4.4 1.4 2
5.6 3   4.5 1.5 2
5.8 2.7 4.1 1   2
6.2 2.2 4.5 1.5 2
5.6 2.5 3.9 1.1 2
5.9 3.2 4.8 1.8 2
6.1 2.8 4   1.3 2
6.3 2.5 4.9 1.5 2
6.1 2.8 4.7 1.2 2
6.4 2.9 4.3 1.3 2
6.6 3   4.4 1.4 2
6.8 2.8 4.8 1.4 2
6.7 3   5   1.7 2
6   2.9 4.5 1.5 2
5.7 2.6 3.5 1   2
5.5 2.4 3.8 1.1 2
5.5 2.4 3.7 1   2
5.8 2.7 3.9 1.2 2
6   2.7 5.1 1.6 2
5.4 3   4.5 1.5 2
6   3.4 4.5 1.6 2
6.7 3.1 4.7 1.5 2
6.3 2.3 4.4 1.3 2
5.6 3   4.1 1.3 2
5.5 2.5 4   1.3 2
5.5 2.6 4.4 1.2 2
6.1 3   4.6 1.4 2
5.8 2.6 4   1.2 2
5   2.3 3.3 1   2
5.6 2.7 4.2 1.3 2
5.7 3   4.2 1.2 2
5.7 2.9 4.2 1.3 2
6.2 2.9 4.3 1.3 2
5.1 2.5 3   1.1 2
5.7 2.8 4.1 1.3 2
6.3 3.3 6   2.5 3
5.8 2.7 5.1 1.9 3
7.1 3   5.9 2.1 3
6.3 2.9 5.6 1.8 3
6.5 3   5.8 2.2 3
7.6 3   6.6 2.1 3
4.9 2.5 4.5 1.7 3
7.3 2.9 6.3 1.8 3
6.7 2.5 5.8 1.8 3
7.2 3.6 6.1 2.5 3
6.5 3.2 5.1 2   3
6.4 2.7 5.3 1.9 3
6.8 3   5.5 2.1 3
5.7 2.5 5   2   3
5.8 2.8 5.1 2.4 3
6.4 3.2 5.3 2.3 3
6.5 3   5.5 1.8 3
7.7 3.8 6.7 2.2 3
7.7 2.6 6.9 2.3 3
6   2.2 5   1.5 3
6.9 3.2 5.7 2.3 3
5.6 2.8 4.9 2   3
7.7 2.8 6.7 2   3
6.3 2.7 4.9 1.8 3
6.7 3.3 5.7 2.1 3
7.2 3.2 6   1.8 3
6.2 2.8 4.8 1.8 3
6.1 3   4.9 1.8 3
6.4 2.8 5.6 2.1 3
7.2 3   5.8 1.6 3
7.4 2.8 6.1 1.9 3
7.9 3.8 6.4 2   3
6.4 2.8 5.6 2.2 3
6.3 2.8 5.1 1.5 3
6.1 2.6 5.6 1.4 3
7.7 3   6.1 2.3 3
6.3 3.4 5.6 2.4 3
6.4 3.1 5.5 1.8 3
6   3   4.8 1.8 3
6.9 3.1 5.4 2.1 3
6.7 3.1 5.6 2.4 3
6.9 3.1 5.1 2.3 3
5.8 2.7 5.1 1.9 3
6.8 3.2 5.9 2.3 3
6.7 3.3 5.7 2.5 3
6.7 3   5.2 2.3 3
6.3 2.5 5   1.9 3
6.5 3   5.2 2   3
6.2 3.4 5.4 2.3 3
5.9 3   5.1 1.8 3

二、代码:

(1)人工生成数据集AriGen:

import math  # 数学
import random  # 随机
import numpy as np
import matplotlib.pyplot as plt# 计算两个样本距离
def dist(xy, a, b):d_l = 0  # 储存当前距离值for i in range(len(xy) - 1):  # 对每个属性d_l += (xy[i][a] - xy[i][b]) ** 2  # 计算平方和d_l = d_l ** 0.5  # 开根号return d_l# 计算avg(C)
def avg(xy, Ci):sum = 0for i in Ci:for j in Ci:sum += dist(xy, i, j)return sum * 2 / (len(Ci) * (len(Ci) - 1))# 计算DB指数
def DB(xy, C, u):sum = 0for i in range(len(C)):  # 每一簇max_C = -float('inf')for j in range(len(C)):if i == j:continuedcen = 0for k in range(len(xy) - 1):  # 对每个属性dcen += (u[i][k] - u[j][k]) ** 2  # 计算平方和dcen = dcen ** 0.5  # 开根号max_ = (avg(xy, C[i]) + avg(xy, C[j])) / dcenif max_ > max_C:max_C = max_sum += max_Creturn sum / len(C)# k均值聚类算法,分k簇。
def jvlei_k(xy, k):n = len(xy[0])  # 储存数据数。u = []  # 储存簇的均值向量C = []  # 储存簇划分# 挑选k个不重复的样本。i = 0j = 0u = random.sample(range(n), k)  # (如果数据随机,这一步其实可以直接选前k个)for i in range(k):  # 对每个初始点。l = u[i]  # 暂存u[i] = []print('初始点', i, end='\t: ')for j in range(len(xy) - 1):  # 对每个属性u[i].append(xy[j][l])print(u[i], xy[j + 1][l])while 1:C = []  # 储存簇划分for i in range(k):  # k 簇C.append([])  # 初始化C。for i in range(n):  # 所有的数据d = float('inf')  # 初始无穷大l = 0  # 属于哪个簇for j in range(k):  # 看和每个簇的距离,找最小。d_ = 0  # 储存当前距离值for ii in range(len(xy) - 1):  # 对每个属性d_ += (xy[ii][i] - u[j][ii]) ** 2  # 计算平方和d_ = d_ ** 0.5  # 开根号if d_ < d:  # 距离更近d = d_  # 最近值更改l = j  # 属于第j簇C[l].append(i)  # 并入第l簇u_ = []  # 新的均值向量for i in range(k):  # 重新计算每个簇的均值u_.append([0] * (len(xy) - 1))for j in C[i]:  # 对簇中每个样本for ii in range(len(xy) - 1):  # 对每个属性u_[i][ii] += xy[ii][j]  # 求和for ii in range(len(xy) - 1):  # 对每个属性u_[i][ii] /= len(C[i])  # 均值l = 0  # 标记for i in range(k):  # 每个均值向量for j in range(len(u[0])):  # 每个属性l += (u[i][j] - u_[i][j]) ** 2  # 求误差if l < 0.01:print('DB=', DB(xy, C, u))return Celse:u = u_[:]# 簇分类和标签对比,返回【最多标签,最多标签所占比例】
def panduan(yi, Ci):biaoqian = {}  # 标签,出现次数for i in Ci:if yi[i] in biaoqian:  # 存在biaoqian[yi[i]] += 1  # 加一else:biaoqian[yi[i]] = 1  # 创建max_ = -1  # 标签max_t = -1  # 标签数for i in biaoqian:  # 所有标签if biaoqian[i] > max_t:  # 找最多的max_ = imax_t = biaoqian[i]return [max_, (max_t * 100 / len(Ci))]# 生成数据集=============================================
x = []  # 数据集x属性
y = []  # 数据集y属性
x.extend(np.random.normal(loc=040.0, scale=10, size=100))  # 向x中放100个均值为40,标准差为10,正态分布的随机数
x.extend(np.random.normal(loc=060.0, scale=10, size=200))  # 向x中放200个均值为60,标准差为10,正态分布的随机数
x.extend(np.random.normal(loc=100.0, scale=10, size=300))  # 向x中放300个均值为100,标准差为10,正态分布的随机数
y.extend(np.random.normal(loc=050.0, scale=10, size=100))  # 向y中放100个均值为50,标准差为10,正态分布的随机数
y.extend(np.random.normal(loc=100.0, scale=10, size=200))  # 向y中放200个均值为100,标准差为10,正态分布的随机数
y.extend(np.random.normal(loc=040.0, scale=10, size=300))  # 向y中放300个均值为40,标准差为10,正态分布的随机数
c = [1] * 100  # c标签第一类为 1  x均值:40 y均值:50
c.extend([2] * 200)  # # c标签第二类为 2  x均值:60 y均值:100
c.extend([3] * 300)  # # c标签第三类为 3  x均值:100 y均值:40
# 生成训练集与测试集=======================================
lt = list(range(600))  # 得到一个顺序序列
random.shuffle(lt)  # 打乱序列
x1 = [[], [], []]  # 初始化x1
for i in lt:  # 做训练集x1[0].append(x[i])  # 加上数据集x属性x1[1].append(y[i])  # 加上数据集y属性x1[2].append(c[i])  # 加上数据集c标签
# 生成簇划分 ==========================================
k = 3  # 分成三簇
C = jvlei_k(x1, k)
# 计算正确率===========================================
for i in range(k):c = panduan(x1[2], C[i])print('第', i, '簇,标签最多的类为', c[0], '占比', c[1], '%')
# 绘图 ===============================================plt.figure(1)  # 第一张画布
for i in range(len(x1[2])):  # 对数据集‘上色’if x1[2][i] == 1:x1[2][i] = 'r'  # 数据集  1 红色else:if x1[2][i] == 2:x1[2][i] = 'y'  # 数据集 2 黄色else:x1[2][i] = 'b'  # 数据集 3 蓝色
plt.scatter(x1[0], x1[1], c=x1[2], alpha=0.5)  # 绘点数据集
plt.xlabel('x')  # x轴标签
plt.ylabel('y')  # y轴标签
plt.title('Initial')  # 标题
#  簇划分:==========================================
plt.figure(2)  # 第二张画布
for i in range(k):  # 对数据集‘上色’for j in C[i]:if i == 1:x1[2][j] = 'r'  # 簇  1 红色else:if i == 2:x1[2][j] = 'y'  # 簇 2 黄色else:x1[2][j] = 'b'  # 簇 3 蓝色
plt.scatter(x1[0], x1[1], c=x1[2], alpha=0.5)  # 绘点数据集
plt.xlabel('x')  # x轴标签
plt.ylabel('y')  # y轴标签
plt.title('End')  # 标题
plt.show()  # 显示

结果示例:

(2) Iris 数据集:

import math  # 数学
import random  # 随机
import numpy as np
import matplotlib.pyplot as plt# 计算两个样本距离
def dist(xy, a, b):d_l = 0  # 储存当前距离值for i in range(len(xy) - 1):  # 对每个属性d_l += (xy[i][a] - xy[i][b]) ** 2  # 计算平方和d_l = d_l ** 0.5  # 开根号return d_l# 计算avg(C)
def avg(xy, Ci):sum = 0for i in Ci:for j in Ci:sum += dist(xy, i, j)return sum * 2 / (len(Ci) * (len(Ci) - 1))# 计算DB指数
def DB(xy, C, u):sum = 0for i in range(len(C)):  # 每一簇max_C = -float('inf')for j in range(len(C)):if i == j:continuedcen = 0for k in range(len(xy) - 1):  # 对每个属性dcen += (u[i][k] - u[j][k]) ** 2  # 计算平方和dcen = dcen ** 0.5  # 开根号max_ = (avg(xy, C[i]) + avg(xy, C[j])) / dcenif max_ > max_C:max_C = max_sum += max_Creturn sum / len(C)# k均值聚类算法,分k簇。
def jvlei_k(xy, k):n = len(xy[0])  # 储存数据数。u = []  # 储存簇的均值向量C = []  # 储存簇划分# 挑选k个不重复的样本。i = 0j = 0u = random.sample(range(n), k)  # (如果数据随机,这一步其实可以直接选前k个)for i in range(k):  # 对每个初始点。l = u[i]  # 暂存u[i] = []print('初始点', i, end='\t: ')for j in range(len(xy) - 1):  # 对每个属性u[i].append(xy[j][l])print(u[i], xy[j + 1][l])while 1:C = []  # 储存簇划分for i in range(k):  # k 簇C.append([])  # 初始化C。for i in range(n):  # 所有的数据d = float('inf')  # 初始无穷大l = 0  # 属于哪个簇for j in range(k):  # 看和每个簇的距离,找最小。d_ = 0  # 储存当前距离值for ii in range(len(xy) - 1):  # 对每个属性d_ += (xy[ii][i] - u[j][ii]) ** 2  # 计算平方和d_ = d_ ** 0.5  # 开根号if d_ < d:  # 距离更近d = d_  # 最近值更改l = j  # 属于第j簇C[l].append(i)  # 并入第l簇u_ = []  # 新的均值向量for i in range(k):  # 重新计算每个簇的均值u_.append([0] * (len(xy) - 1))for j in C[i]:  # 对簇中每个样本for ii in range(len(xy) - 1):  # 对每个属性u_[i][ii] += xy[ii][j]  # 求和for ii in range(len(xy) - 1):  # 对每个属性u_[i][ii] /= len(C[i])  # 均值l = 0  # 标记for i in range(k):  # 每个均值向量for j in range(len(u[0])):  # 每个属性l += (u[i][j] - u_[i][j]) ** 2  # 求误差if l < 0.01:print('DB=', DB(xy, C, u))return Celse:u = u_[:]# 簇分类和标签对比,返回【最多标签,最多标签所占比例】
def panduan(yi, Ci):biaoqian = {}  # 标签,出现次数for i in Ci:if yi[i] in biaoqian:  # 存在biaoqian[yi[i]] += 1  # 加一else:biaoqian[yi[i]] = 1  # 创建max_ = -1  # 标签max_t = -1  # 标签数for i in biaoqian:  # 所有标签if biaoqian[i] > max_t:  # 找最多的max_ = imax_t = biaoqian[i]return [max_, (max_t * 100 / len(Ci))]f = open('Iris.txt', 'r')  # 读文件
x = [[], [], [], [], []]  # 花朵属性,(0,1,2,3),花朵种类
x1 = [[], [], [], [], []]
x2 = [[], [], [], [], []]
y = []  # 分支节点[分支类,[分支节点1],[分支节点2]···]  递归决策树
y1 = []
while 1:yihang = f.readline()  # 读一行if len(yihang) <= 1:  # 读到末尾结束breakfenkai = yihang.split('\t')  # 按\t分开for i in range(5):  # 分开的五个值x[i].append(eval(fenkai[i]))  # 化为数字加到x中
print('数据集===============================================')
print(len(x[0]))
for i in range(len(x)):print(x[i])
x1 = x[:]
# 生成簇划分 ==========================================
k = 3  # 分成三簇
C = jvlei_k(x1, k)
# 计算正确率===========================================
for i in range(k):c = panduan(x1[4], C[i])print('第', i, '簇,标签最多的类为', c[0], '占比', c[1], '%')
# 绘图 ===============================================
# 这里改输出那三维,(有四维,选三维)
a = 0
b = 2
c = 3
for i in range(len(x1[4])):  # 对数据集‘上色’if x1[4][i] == 1:x1[4][i] = 'r'  # 数据集  1 红色else:if x1[4][i] == 2:x1[4][i] = 'y'  # 数据集 2 黄色else:x1[4][i] = 'b'  # 数据集 3 蓝色
fig = plt.figure()
m = plt.axes(projection='3d')
m.scatter3D(x1[a], x1[b], x1[c], c=x1[4], alpha=0.8)  # 绘制散点图
plt.xlabel(a)  # x轴标签
plt.ylabel(b)  # y轴标签
plt.title('Initial')  # 标题
#  簇划分:==========================================
for i in range(k):  # 对数据集‘上色’for j in C[i]:if i == 1:x1[4][j] = 'r'  # 簇  1 红色else:if i == 2:x1[4][j] = 'y'  # 簇 2 黄色else:x1[4][j] = 'b'  # 簇 3 蓝色
fig = plt.figure()
m = plt.axes(projection='3d')
m.scatter3D(x1[a], x1[b], x1[c], c=x1[4], alpha=0.8)  # 绘制散点图
plt.xlabel(a)  # x轴标签
plt.ylabel(b)  # y轴标签
plt.title('End')  # 标题
plt.show()  # 显示

结果示例:

K-均值聚类算法(Python,机器学习 ,绘图)相关推荐

  1. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  2. python(scikit-learn)实现k均值聚类算法

    k均值聚类算法原理详解 示例为链接中的例题 直接调用python机器学习的库scikit-learn中k均值算法的相关方法 from sklearn.cluster import KMeans imp ...

  3. 机器学习之无监督学习-K均值聚类算法

    机器学习之无监督学习-K均值聚类算法 对于无监督学习,有两类重要的应用,一个是聚类,一个是降维.我们今天主要学习聚类中的K均值聚类. 我们先看看下图,图a为原始的数据点,我们想要对图a的数据点进行分类 ...

  4. 机器学习实战-61:K均值聚类算法(K-Means)

    K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...

  5. Python金融数据挖掘 第11章 复习思考题1 (聚类)给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,用K均值聚类算法来训练模型,分4类。

    1.题目 给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,如图11-12所示. data_multivar.txt 图11-12 数据集 da ...

  6. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  7. k均值聚类算法原理和(TensorFlow)实现

    顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...

  8. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

  9. Thinking in SQL系列之五:数据挖掘K均值聚类算法与城市分级

    原创: 牛超   2017-02-21   Mail:10867910@qq.com 引言:前一篇文章开始不再介绍简单算法,而是转到数据挖掘之旅.感谢CSDN将我前一篇机器学习C4.5决策树算法的博文 ...

  10. 计算机视觉面试考点(14)K均值聚类算法(K-Means)

    计算机视觉工程师在面试过程中主要考察三个内容:图像处理.机器学习.深度学习.然而,各类资料纷繁复杂,或是简单的知识点罗列,或是有着详细数学推导令人望而生畏的大部头.为了督促自己学习,也为了方便后人,决 ...

最新文章

  1. 短信编码类无错版PDUdecoding.cs
  2. 怎么将两个datatable 合并_视频音频合并大师免费版-视频音频合并大师2020版下载(附使用方法) v2020.02.08...
  3. 【Linux 线程】常用线程函数复习《一》
  4. python自带的集成开发环境是什么-常用的几款Python集成开发环境或者编辑器详解...
  5. Android PC投屏简单尝试—最终章2
  6. yy神曲url解析php_使用PHP来简单的创建一个RPC服务
  7. curl http header_PHP如何解析header头部信息
  8. 将某个字段改为不重复(unique)
  9. c++和java的类转换的区别
  10. java如何实现多继承
  11. C# 客户端内存优化分析
  12. zoj 3488 conic section
  13. [转] 深入浅出oracle锁---原理篇
  14. 3dm java32位_3DM游戏运行库合集安装包v2.3
  15. 5000个常用汉字(完整版) 繁体简体
  16. html图片顺时针倾斜50度,html – 使用transform进行垂直对齐:translateY(-50%);里面绝对定位的div...
  17. SkeyeLive同屏直播库库功能介绍和接口说明与调用
  18. Python基础知识笔记(三)——字典、集合
  19. 【转】Android Protobuf应用及原理
  20. DIY:利用单片机自制的RGB拖尾流水灯,含电路图、源代码、演示视频、效果图

热门文章

  1. 论文翻译怎么在线操作,论文翻译的步骤
  2. python 仪表盘监控_做一个基于python的树莓派MCU性能-温度监控仪表盘
  3. C语言的文件读取与写入操作
  4. Postman如何携带token——Bearer Token和Headers
  5. 超干货丨你想了解的短视频私域流量玩法都在这
  6. 康宁玻璃ct值计算公式_CT值的计算公式?
  7. 【文献阅读笔记之】ACFNet: Attentional Class Feature Network for Semantic Segmentation
  8. 数据结构 - 1 顺序表
  9. 使用scale缩放字体
  10. 日本一网友买煤炭自杀