使用 sklearn 的 Kmeans 获得更好的结果
Posted
技术标签:
【中文标题】使用 sklearn 的 Kmeans 获得更好的结果【英文标题】:getting better results with sklearn's Kmeans 【发布时间】:2021-12-24 14:49:12 【问题描述】:我有一个包含三个集群的 3d 空间,但是当我使用 Sklearn.cluster Kmeans 执行集群时,结果不太好。这是代码和结果。希望你能帮忙:)
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
km = KMeans(n_clusters=3)
y_predicted = km.fit_predict(df1[['x','y','z']])
y_predicted
def create_3d_scatter_wprd(df):
fig = plt.figure(figsize=(48, 24))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(df['x'], df['y'], df['z'], c=y_predicted)
plt.show()
create_3d_scatter_wprd(df)
以下是聚类的结果:
对于那些对如何制作数据感兴趣的人,这里是代码
space = np.zeros((100,100,100))
def distance(a,b,c,i,j,k,r):
if math.dist((a,b,c),(i,j,k)) <= r:
return True
else:
return False
for i in range(1,31):
for j in range(1,31):
for k in range(1,31):
space[i,j,k] = 1
for i in range(60,85):
for j in range(60,85):
for k in range(60,85):
space[i,j,k] = 2
for i in range(35,55):
for j in range(35,55):
for k in range(35,55):
if distance(i,j,k,45,45,45,10):
space[i,j,k] = 3
【问题讨论】:
如何重现df1
?
@Corralien df1 只是一个包含点 x,y,z 坐标的简单数据框
我明白,但是如何创建这个数据框来获得类似的情节?
@Corralien 好的,我已经添加了数据生成的代码!抱歉耽搁了!没有收到您的评论。
【参考方案1】:
没有您的数据很难重现您的问题,您会明白原因。
f = lambda l,h: (np.random.randint(l, h, (30,30,30)) \
+ np.random.random((30, 30, 30))).reshape(-1, 3)
df = pd.DataFrame(np.concatenate([f(10, 20), f(20, 30), f(30, 40)]),
columns=list('xyz'))
# Your code here
...
create_3d_scatter_wprd(df)
【讨论】:
以上是关于使用 sklearn 的 Kmeans 获得更好的结果的主要内容,如果未能解决你的问题,请参考以下文章
sklearn KMeans 中 KMeans.cluster_centers_ 的值
菜菜的sklearn课堂笔记聚类算法Kmeans-重要参数init & random_state & n_init:初始质心怎么放更好
详解聚类算法Kmeans-重要参数init & random_state & n_init:初始质心怎么放更好菜菜的sklearn课堂笔记