kmeans算法python命令_Python中使用K-means算法

eb59d909cf01d1148da8a902d80583ec.png

k-means是机器学习中最常用的聚类算法,关于k-means算法的数学原理、算法、伪码等已有相当丰富的文献,在此不再赘述。

1、调用以下库import numpy as np   #用于抽样和生成随机数

from sklearn.cluster import KMeans   #sklearn自带的Kmeans算法, 用于严重本文算法结果是否正确

import matplotlib.pyplot as plt     #结果可视化

import sys   #需要用到sys.exit()函数

若不需要验证聚类结果是否可以不使用Sklearn库。

2、生成用于训练的随机数据np.set_printoptions(suppress=True)    #令numpy的结果不以科学计数法的方式输出

Data = np.array([[1.0, 2.0], [1.5, 1.8], [3, 4], [6, 8], [8, 8], [1, 0.6],

[9, 11], [7, 10]])  #你也可以通过抽样的方式来更快的获得测试数据

3、定义用于选择随机初始点和簇数(k)的函数def K_means(data, k):

global Mean

mean = []

a = np.max(data[:, 0])

b = np.min(data[:, 0])

c = np.max(data[:, 1])

d = np.min(data[:, 1])

for i in range(k):

x = np.random.uniform(a, b, 1)

#此处返回array

y = np.random.uniform(c, d, 1)  #此处返回array

mean.append([float(x), float(y)])

Mean = np.array(mean)

return Mean

在上面的代码中,为了限定初始点(x,y)的位置不会超出样本点的范围,因此均匀抽样的上下限是指训练数据(a,b)和(c,d)的最小横距。

4、定义可视化函数, 绘制测试数据散点图def vision(data, cell):

plt.figure(figsize=(12,6))

ax1 = plt.subplot(121)

ax1.scatter(Data[:, 0], Data[:, 1])   #原始数据散点图

ax1.scatter(point[:, 0], point[:, 0])    #同时将随机选取的初始点表示出来

plt.xlabel("x")

plt.ylabel("y")

plt.title("scatter of " + "rural" + " data")

ax2 = plt.subplot(122)

ax2.scatter(Data[:, 0], Data[:, 1])    #原始数据散点图

ax2.scatter(data[:, 0], data[:, 1])     #经过迭代后最终确定的聚类点

plt.xlabel("x")

plt.ylabel("y")

plt.title("scatter of " + cell + " data")

plt.show()

聚类结果的可视化对于判断聚类结果的准确性至关重要。

5、定义迭代过程, 通过不断计算各个样本对聚类点的欧式聚类, 来不断更新聚类点def iteration(Data, point):

A = []

B = []

for i in range(len(Data)):

d1 = np.sqrt(sum(pow(Data[i] - point[0], 2)))

d2 = np.sqrt(sum(pow(Data[i] - point[1], 2)))

if d1 > d2:

A.append(list(Data[i]))

else:

B.append(list(Data[i]))

if len(A) == len(Data) or len(B) == len(Data):

print("初始化错误")

sys.exit(0)

new_x1 = np.mean(np.array(A)[:, 0])

new_y1 = np.mean(np.array(A)[:, 1])

new_x2 = np.mean(np.array(B)[:, 0])

new_y2 = np.mean(np.array(B)[:, 1])

new_point = np.array([[new_x1, new_y1], [new_x2, new_y2]])

return new_point

注意, 上段代码中加入了一个if语句if len(A) == len(Data) or len(B) == len(Data):

print("初始化错误")

sys.exit(0)

由于初始点是随机产生的,所以这个条件语句是非常必要的,因此有可能所有的样本点都只接近一个聚类中心而远离另一个聚类中心,这样就不能形成两个聚类中心,程序将会报错,因此我们需要排除出现这种情况的可能性。一旦所有样本点都接近一个聚类中心时令程序停止。

以上就是Python中使用K-means算法,希望能对大家有所帮助!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值