机器学习之聚类算法

一、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()

结果为:

 可以看到分成了四类,并且可以排除异常值的影响。

可以不断调节参数来测试聚类效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九磅十五便士°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值