最大最小距离法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import matplotlib.pyplot as plt
import math

# 0 3 2 1 5 4 6 5 6 7
# 0 8 2 1 3 8 3 4 4 5
# 测试集合
# x = [0, 3, 2, 1, 5, 4, 6, 5, 6, 7]
# y = [0, 8, 2, 1, 3, 8, 3, 4, 4, 5]

print("请输入所有点的横坐标")
arr1 = input()
x = [float(n) for n in arr1.split()]
print("请输入所有点的纵坐标")
arr2 = input()
y = [float(n) for n in arr2.split()]

# 将x y复制一份,切片复制不会相互影响
cx = x[:]
cy = y[:]
# 类别判断函数
judge = [-1] * len(x)
# 倍数
Multiple = 0.45
# Multiple = 0.5
# 任意一个模式样本作为第1个聚类中心
i = 0
# 实时跟踪zx zy的下标变化
k = 1
zx = [x[i]]
zy = [y[i]]
# 用于记录类心坐标
cenx = [x[i]]
ceny = [y[i]]

judge[i] = k
# 在原数组中删除该点
x.pop(i)
y.pop(i)
# 得到其余点的个数
length = len(x)
# 用于记录距离
distance = 0
# 用于记录最大值的下标
j = 0
for i in range(0, length):
# 得到最大距离
if math.sqrt(math.pow(x[i] - zx[0], 2) + math.pow(y[i] - zy[0], 2)) > distance:
distance = math.sqrt(math.pow(x[i] - zx[0], 2) + math.pow(y[i] - zy[0], 2))
# 得到距离最远的一个点
j = i
# 更新k的值,说明目前存在几个类心
k = k + 1
# 将该点定位新的聚类中心
for l in range(0, len(cx)):
if cx[l] == x[j] and cy[l] == y[j]:
judge[l] = k
cenx.append(x[j])
ceny.append(y[j])
break
zx.append(x[j])
zy.append(y[j])
x.pop(j)
y.pop(j)
length = length - 1

# 距离数组
d = [-1.0] * k

# 最小距离数组
mind = []
# 得到目前的剩余坐标
m = 0
while m < length:
for a in range(0, len(x)):
for j in range(k):
d[j] = math.sqrt(math.pow(x[a] - zx[j], 2) + math.pow(y[a] - zy[j], 2))
# 得到每个点到目前已知点的距离
mind.append(min(d))
print("各个距离中最小的点")
print(mind)

for a in range(0, len(x)):
for j in range(k):
d[j] = math.sqrt(math.pow(x[a] - zx[j], 2) + math.pow(y[a] - zy[j], 2))
if min(d) == max(mind):
location = a
break

# 判断最小距离与类心间的距离
if Multiple * distance < max(mind):
k = k + 1
d = [-1.0] * k
# print(d)
# print("新类心,坐标为:")
# print(x[i])
# print(y[i])
for l in range(0, len(cx)):
if cx[l] == x[location] and cy[l] == y[location]:
judge[l] = k
zx.append(x[location])
zy.append(y[location])
cenx.append(x[location])
ceny.append(y[location])
x.pop(location)
y.pop(location)
length = length - 1
m = 0

mind = []
break
else:
# 离谁小就归到谁的类中
for j in range(0, k):
if min(d) == d[j]:
# 此时归到这一类中
# print("该点的坐标为")
# print(x[m], y[m])
# print("该点属于第" + str(j + 1) + "类")
for l in range(0, len(cx)):
if cx[l] == x[location] and cy[l] == y[location]:
judge[l] = j + 1
x.pop(location)
y.pop(location)
length = length - 1
m = 0
mind = []

print("共分成了" + str(k) + "类")
print("聚类中心分别为:")
print(cenx)
print(ceny)
# 输出每个点应该属于的类别
print("每个点应该属于的类别")
print(judge)

for i in range(len(cx)):
if judge[i] == 1:
plt.scatter(cx[i], cy[i], color="red")
elif judge[i] == 2:
plt.scatter(cx[i], cy[i], color="green")
elif judge[i] == 3:
plt.scatter(cx[i], cy[i], color="pink")
elif judge[i] == 4:
plt.scatter(cx[i], cy[i], color="magenta")
elif judge[i] == 5:
plt.scatter(cx[i], cy[i], color="cyan")
elif judge[i] == 6:
plt.scatter(cx[i], cy[i], color="blue")
elif judge[i] == 7:
plt.scatter(cx[i], cy[i], color="yellow")
else:
plt.scatter(cx[i], cy[i], color="pink")
plt.show()
相关文章
评论
分享
  • 感知器

    感知器算法: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596...

    感知器
  • Windows下neo4j的安装

    neo4j是一个高性能的NOSQL图形数据库,他将结构化数据存储在网络上而不是表中。他是一个嵌入式的、基于磁盘的、具备完全的事物特性的Java持久化引擎,neo4j也可看做是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。——百度...

    Windows下neo4j的安装
  • java实现类FTP程序

    继承程序设计实验,实验说明如图所示: 集成程序设计实验 TCP实现首先说明下基于TCP实现的功能: (1)能够实现多用户的同时连接 (2)用户执行成功的命令会在其他用户终端上显式说明 (3)当前用户数以及在线情况会在服务端实时显...

    java实现类FTP程序
  • Java中的流

    流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入输出都是以流的方式进行。设备可以是文件、网络、内存等。 I/O字节流InputStream字节输入流OutputStream字节输出流用于以字节的形式读取和写入数...

    Java中的流
  • eclipse使用

    Eclipse是一个开放源代码的、基于Java的可拓展开发平台。 常用快捷键 快捷键 作用 alt+/ 代码快速补全 ctrl+1 快速修复 ctrl+shift+f 代码格式化 ctrl+d 删除一行代码 ...

    eclipse使用
  • Python网络编程

    网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。 它的含义是使用套接字来达到进程间的通信。套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。 套接字Socket=(IP地址:端口号) 端口号是...

    Python网络编程
  • Centos安装

    虚拟机下载及安装1.进入VMware官网,转到下载页面 https://my.vmware.com/cn/web/vmware/info/slug/desktop_end_user_computing/vmware_workstati...

    Centos安装
  • JavaEE开发准备

    个人电脑硬件配置: Windows 10 64位家庭中文版 8G运行内存 Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 1.Java JDK安装及配置(1)下载和安装首先进入oracle网站中Ja...

    JavaEE开发准备
  • Python进阶学习

    假期补习补习Python,防止以后用到炸锅。 闭包在Python语言中,一切皆对象。 闭包:一个函数定义中引用了函数外定义的变量,并且该函数可以在其定义环境外被执行。 闭包 = 函数 + 环境变量 123456789101...

    Python进阶学习
  • 推荐算法研究(一)

    推荐算法大体分为3类:基于系统过滤的推荐、基于内容的推荐、混合推荐 1.基于协同过滤的推荐系统(Collaborative Filtering)使用行为数据,利用集体智慧来推荐。属于有监督学习。基于用户的协同过滤(找和你兴趣相似的人所...

    推荐算法研究(一)
Please check the comment setting in config.yml of hexo-theme-Annie!