当前位置: 首页 > 图灵资讯 > 行业资讯> Python中使用K-means算法

Python中使用K-means算法

来源:图灵python
时间: 2024-09-09 10:09:31

k-means是机器学习中最常用的聚类算法。k-means算法有丰富的数学原理、算法、伪码等文献,这里就不赘述了。

1、调用以下库

importnumpyasnp#抽样和生成随机数
fromsklearn.clusterimportKMeans#Sklearn自带的Kmeans算法,本文算法结果是否正确
importmatplotlib.pyplotasplt#结果可视化
importsys#需要使用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)的函数

defK_means(data,k):
globalMean
mean=[]
a=np.max(data[:,0])
b=np.min(data[:,0])
c=np.max(data[:,1])
d=np.min(data[:,1])
foriinrange(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)
returnMean

在上述代码中,为了限制初始点(x,y)位置不会超过样本点的范围,所以均匀抽样的上下限是指训练数据(a,b)和(c,d)最小水平距离。

4、定义可视化函数, 绘制测试数据散点图

defvision(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("scatterof"+"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("scatterof"+cell+"data")
plt.show()

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

5、定义迭代过程, 通过不断计算各种样本对聚类点的欧式聚类, 不断更新聚类点

defiteration(Data,point):
A=[]
B=[]
foriinrange(len(Data)):
d1=np.sqrt(sum(pow(Data[i]-point[0],2))))
d2=np.sqrt(sum(pow(Data[i]-point[1],2)))
ifd1>d2:
A.append(list(Data[i]))
else:
B.append(list(Data[i]))
iflen(A)==len(Data)orlen(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]])
returnnew_point

注意, 在上一个代码中添加一个if语句

iflen(A)==len(Data)orlen(B)==len(Data):
print("初始化错误")
sys.exit(0)

因为初始点是随机产生的,所以这个条件陈述是非常必要的,所以所有的样本点可能只接近一个聚类中心,远离另一个聚类中心,所以不能形成两个聚类中心,程序会报告错误,所以我们需要排除这种情况的可能性。一旦所有的样本点都接近一个聚类中心的季节性程序停止。

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