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算法
,希望能对大家有所帮助!
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python文件操作需要导入模块吗?12/10
- ♥ 尝试异常调试引发 python3 中抛出的异常11/26
- ♥ python如何导入pygame模块08/22
- ♥ python输出如何不换行10/25
- ♥ 如何在python中找到导数10/08
- ♥ 如何在python3中执行pip11/02
内容反馈