一、K均值聚类算法
1.使用K-means算法对数据进行聚类
# K均值聚类算法
data1 = pd.DataFrame({'X': np.random.randint(1, 50, 100), 'Y': np.random.randint(1, 50, 100)})
# print(data1)
data = pd.concat([data1 + 50, data1])
plt.style.use('ggplot')
# 使用K—means算法进行聚类
y_pred = KMeans(n_clusters=2).fit_predict(data)
print(y_pred)
plt.scatter(data.X, data.Y, c=y_pred)
plt.show()
效果如图
2.评价聚类效果的方法
num = metrics.calinski_harabasz_score(data, y_pred)
print(num) # 这个值越大,聚类效果越好
可以将自己生成的数据集分成两类或者三类验证聚类效果
当分成两类时
评价数值为:
当分成三类时;
评价效果:
3.小麦数据集进行聚类
(1)小麦数据集
(2)进行聚类的结果:
(3) 与真实分类进行对比,计算准确率
(4)对模型进行评价
(5)代码
# 小麦数据集聚类
data = pd.read_csv('./数据集/seeds_dataset.txt', header=None, delim_whitespace=True,
names=['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'Y'])
print(data)
y_pred = KMeans(n_clusters=3).fit_predict(data[['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7']])
print(y_pred)
y_pre = pd.Series(y_pred)
print(y_pre)
# print(data.Y)
y_pre = y_pre.map({0: 1, 1: 2, 2: 3})
print(y_pre)
data_p = pd.DataFrame({'y_pre': y_pre, 'y': data.Y})
data_p['acc'] = data_p.y_pre == data.Y
effect = data_p.acc.sum() / len(data_p)
print(effect) # 预测的准确率
num = metrics.calinski_harabasz_score(data[['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7']], y_pred)
print(num)
4.K-means算法的缺点
1.首先需要给定K值,在不知道K值的情况下,是一个不小的挑战 2.有些数据集效果不好,与肉眼识别结果相差较大 3.不够精细,如对异常值的处理
二、DBSCAN算法
# DBSCAN 一种基于密度的聚类方法,可以排除异常值
print(data1)
plt.scatter(data1.X, data1.Y)
plt.show()
data2 = pd.concat([data1 + 50, data1])
print(data2)
plt.scatter(data2.X, data2.Y)
plt.show()
y_pred = DBSCAN(eps=7, min_samples=2).fit_predict(data2)
print(y_pred)
plt.scatter(data2.X, data2.Y, c=y_pred)
plt.show()
结果为:
可以看到分成了四类,并且可以排除异常值的影响。
可以不断调节参数来测试聚类效果。