DAY19聚类演算法(kmeans)

昨天介绍完kmeans演算法程序前半段,今天就要把後半段内容给写完:
首先回顾一下昨天我们得到这个分类图
https://ithelp.ithome.com.tw/upload/images/20211003/20141654mpjyXQORKp.png
接下来就要算这个类个别的中心点:
程序如下:

#建立动态列表
for j in range(d):
	locals()['data_'+str(j+1)] = []

#帮资料分类
for i in range(len(label_data_x)):
	k=[]
	for j in range(d):
		#计算欧式距离
		value_k=np.sqrt((x_y_used[j][0]-label_data_x[i])**2+(x_y_used[j][1]-label_data_y[i])**2)
		k.append(value_k)
	#取最小
	tmp = min(k)
	index = k.index(tmp)
	#print("第",i+1,"笔资料为第",index+1,'类')
	#分类资料添加到每一组
	locals()['data_'+str(index+1)].append([label_data_x[i],label_data_y[i]])
	#画在图上
	plt.scatter(label_data_x[i],label_data_y[i],color=color_used[index])
plt.show()
#显示每一组资料
for j in range(d):
	print(locals()['data_'+str(j+1)])

结果如下:

[[45, 59], [52, 63], [18, 52], [52, 70], [45, 63], [24, 55], [33, 46], [29, 54], [51, 66]]
[[72, 24], [53, 23], [55, 14], [61, 8], [69, 7], [64, 19]]
[[20, 36], [12, 39], [28, 30]]

接下来对於这d笔资料来找出每组中心点(把颜色调淡),程序如下:

for j in range(d):
	# print(locals()['data_'+str(j+1)])
	#取平均点
	label_x=[i[0] for i in locals()['data_'+str(j+1)]]
	label_y=[i[1] for i in locals()['data_'+str(j+1)]]
	xi=np.mean(label_x)
	yi=np.mean(label_y)
	print(xi,yi)
	#划出中心点并调淡
	plt.scatter(xi,yi,color=color_used[j],alpha=0.5)
plt.show()

如图:
https://ithelp.ithome.com.tw/upload/images/20211003/20141654tjKEjntR6V.png
所以接下来就是回圈直到所有类别不变动
所以程序如下:(在帮资料分类那段要加上old_label)

#帮资料分类
for i in range(len(label_data_x)):
	k=[]
	for j in range(d):
		#计算欧式距离
		value_k=np.sqrt((x_y_used[j][0]-label_data_x[i])**2+(x_y_used[j][1]-label_data_y[i])**2)
		k.append(value_k)
	#取最小
	tmp = min(k)
	index = k.index(tmp)
	print("第",i+1,"笔资料为第",index+1,'类')
	#添加所有index资料
	old_label.append(index+1)

	#分类资料添加到每一组
	locals()['data_'+str(index+1)].append([label_data_x[i],label_data_y[i]])
	#画在图上
	plt.scatter(label_data_x[i],label_data_y[i],color=color_used[index])
plt.show() 

之後新中心点要加上x_check和y_check程序码如下:

#显示每一组资料
x_check=[]
y_check=[]
for j in range(d):
	# print(locals()['data_'+str(j+1)])
	#取平均点
	label_x=[i[0] for i in locals()['data_'+str(j+1)]]
	label_y=[i[1] for i in locals()['data_'+str(j+1)]]
	xi=np.mean(label_x)
	yi=np.mean(label_y)
	x_check.append(xi)
	y_check.append(yi)
	print(xi,yi)
	#划出中心点并调淡
	plt.scatter(xi,yi,color=color_used[j],alpha=0.5)

接着帮新资料加上old_label2

old_label2=[]
#帮资料分类
for i in range(len(label_data_x)):
	k=[]
	for j in range(d):
		#计算欧式距离
		value_k=np.sqrt((x_check[j]-label_data_x[i])**2+(y_check[j]-label_data_y[i])**2)
		k.append(value_k)
	#取最小
	tmp = min(k)
	index = k.index(tmp)
	print("第",i+1,"笔资料为第",index+1,'类')
	#添加所有index资料 
	old_label2.append(index+1)

	#分类资料添加到每一组
	locals()['data_'+str(index+1)].append([label_data_x[i],label_data_y[i]])
	#画在图上
	plt.scatter(label_data_x[i],label_data_y[i],color=color_used[index])
plt.show()
print(old_label2)
print(old_label)

这样就会产生新的图和新的label

[1, 1, 3, 2, 3, 3, 2, 1, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1]
[1, 1, 1, 2, 3, 3, 2, 1, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1]

只要label不一样,就重复这个动作直到label完全一样
while部分就留给大家自己练习-->基本上就是如果不一样就把old_label2传给old_label(更新),并且while後面算中心点地方一直到求出old_label2
好,今天讲解关於kmeans演算法结束,明天就要讲解DBSCAN

在娃娃指引下,男孩走回了木屋,男孩看着焦黑的木屋,心理在犹豫要不要过去,在男孩这麽想同时,娃娃突然开始唱歌,就这样男孩走到木屋门口,突然有二个身影从木屋里冲了出来,朝男孩冲了过来,只是在靠近男孩时,娃娃突然抬手,瞬间被弹飞,被弹飞的狐狸不可置信看着娃娃,而男子只是生气得怒眼瞪着娃娃,男孩很讶异,娃娃有这种能力,但男孩心理同时也升起了一丝不安
		--|我不是你的玩具,我的感情是我自己的|--  MC.SM

<<:  Day 21. 条件渲染 – v-if、v-show

>>:  Day 19 - 将 NEWS 後台储存资料提取後,送至前台渲染画面 (上) - News List Page CTE 暂存表应用 - ASP.NET Web Forms C#

Gulp npm install 中的 --save 与 --save-dev 差异 DAY94

npm install --save (产品用) npm install --save-dev (开...

Day 26. 测试SSR常见问题

EADDRINUSE 表示你使用的Port被其他的Application占用,你可以把占用的appl...

Raspberry pi 与周边的沟通

Raspberry pi 提供的40根Pin中 有26个GPIO可用 当中有几个串列传输的技术是我们...

4. 看看网页前端技术用在哪里

网页前後端是什麽? 网页前端就是你现在在看的浏览器上面显现的画面,而後端处理资料库存取,与把资料送到...

[day27] PostBack资料data处理 显示菜单

对PostBack Event中的字串进行处理,由於这个参数仅能放入字串,所以可以套用网页Query...