Desperate struggle667 2022-10-19 19:55 采纳率: 76.2%

# 关于#python#的问题，如何解决？

###### python在跑k均值聚类时候的时候，每次运行结果都不一样，求帮忙瞅瞅是哪出问题了？
``````import numpy as np
x,y =iris.data,iris.target
#x=np.array([[1,1,1,1],[10,10,10,10],[20,20,20,20],[5,5,5,5],[3,3,3,3],[6,6,6,6],[25,25,25,25]])
centroids_a=[]
list1=[]
#聚类中心
def init_random_centroids(k,x):
data1=x.shape[0]
suiji_a =np.random.choice(data1,k,replace=False)
for i in suiji_a:
xlist = x[i]
centroids_a.append(xlist)
centroids =np.array(centroids_a)
return centroids

#计算距离
def euclidean_distance(one_sample, x):
#print("中心点",x)
#print("样本",one_sample)
#print("单个样本",one_sample)
#print("中心",x)
distances= np.sum((x-one_sample)**2)
#print("距离",distances)
return distances

#返回离样本最近的中心索引
def _closest_centroid(sample, centroids):
k = centroids.shape[0]
#print("k",k)
#print("聚类中心",centroids)
list_distance =[]
for i in range(k):
a=euclidean_distance(one_sample=sample, x=centroids[i])
list_distance.append(a)
# print("list",list_distance)
distance_list=np.array(list_distance)
id =np.argmin(distance_list)
#print("单个样本与聚类中心的距离：",distance_list)
#print("距离最近的中心索引",id)
return id

#将所有样本进行归类，归类规则就是将该样本归类到与其最近的中心
def create_clusters(k,centroids, x):
clusters = [[] for _ in range(k)]
#print("cen",centroids)
for sample in x:
ys=_closest_centroid(sample, centroids)
#print(ys)
clusters[ys].append(sample)
#print("0",clusters[0])
#print("1",clusters[1])
#print("2",clusters[2])
return clusters

#中心点更新
def update_centroids(k,clusters):
#print(k)
# print("类型0",clusters[0])
# print("类型1",clusters[1])
# print("类型2",clusters[2])
for i in range(k):
centroid = np.mean(clusters[i], axis=0)
#print("平均聚点",centroid)
centroids[i] = centroid
print("新聚类中心",centroids)
return centroids

# 将所有样本进行归类，其所在的类别的索引就是其类别标签
def get_cluster_labels(clusters, x):
#print(clusters)
y_pred = []
for sample in x:
ys=_closest_centroid(sample=sample, centroids=centroids)
y_pred.append(ys)
print(y_pred)
return y_pred

#随机选取k个聚类中心
centroids = init_random_centroids(3, x)
for number in range(20000000):
#样本归类
cluster = create_clusters(k=3,centroids=centroids,x=x)
former_centroids = centroids
#更新新的聚类中心
clusters = update_centroids(k=3,clusters=cluster)
diff = centroids - former_centroids
if diff.any() <0.000001:
get_cluster_labels(clusters=cluster,x=x)
break

``````
• 写回答

#### 6条回答默认 最新

• Jackyin0720 2022-10-19 20:37
关注

K-Means算法从随机初始化簇质心开始。每次运行KMeans时，此选择都会有所不同，可能会产生不同的结果。为了得到可再现的结果，可以在KMeans中使用random_state参数，这将修复簇中心线的初始选择：

``````model = KMeans(n_clusters=number_of_clusters,
init='k-means++',
max_iter=100,
n_init=100,
random_state=123)

``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

• 系统已结题 10月30日
• 已采纳回答 10月22日
• 创建了问题 10月19日

#### 悬赏问题

• ¥15 Qt4代码实现下面的界面
• ¥15 prism提示我reinstall prism 如何解决
• ¥15 asp.core 权限控制怎么做，需要控制到每个方法
• ¥20 while循环中OLED显示中断中的数据不正确
• ¥15 这个视频里的stm32f4代码是怎么写的
• ¥15 JNA调用DLL报堆栈溢出错误（0xC00000FD）
• ¥15 请教SGeMs软件的使用
• ¥15 自己用vb.net编写了一个dll文件，如何只给授权的用户使用这个dll文件进行打包编译，未授权用户不能进行打包编译操作？
• ¥50 深度学习运行代码直接中断
• ¥20 需要完整的共散射点成像代码