一,鸢尾花Iris数据集解析
![](https://i-blog.csdnimg.cn/blog_migrate/31c63857a1aed2928307e16845bf45ae.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2eba6aa17c170a9bfed91525ec76b330.png)
![](https://i-blog.csdnimg.cn/blog_migrate/71ff50c50ac8e29de89c572a2b5ebf12.png)
![](https://i-blog.csdnimg.cn/blog_migrate/477b9cbe5c7bf63b8c7b0e8ce3fda515.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7002f1cd21d62ffc269d63b4320a21a6.png)
二,绘制Iris数据集散点图,数据集已经给出具体类别
from sklearn import datasets
import matplotlib.pyplot as plt
#加载数据集,是一个字典类似Java中的map
lris_df = datasets.load_iris()
#挑选出前两个维度作为x轴和y轴,你也可以选择其他维度
x_axis = lris_df.data[:,0]
y_axis = lris_df.data[:,2]
#c指定点的颜色,当c赋值为数值时,会根据值的不同自动着色
plt.scatter(x_axis, y_axis, c=lris_df.target)
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/62207c2d17ce9bc2973f634cc69ad689.png)
三,Python使用kmeans聚类,并绘制新的聚类散点图。
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
#加载数据集,是一个字典类似Java中的map
lris_df = datasets.load_iris()
#挑选出前两个维度作为x轴和y轴,你也可以选择其他维度
x_axis = lris_df.data[:,0]
y_axis = lris_df.data[:,2]
#这里已经知道了分3类,其他分类这里的参数需要调试
model = KMeans(n_clusters=3)
#训练模型
model.fit(lris_df.data)
#选取行标为100的那条数据,进行预测
prddicted_label= model.predict([[6.3, 3.3, 6, 2.5]])
#预测全部150条数据
all_predictions = model.predict(lris_df.data)
#打印出来对150条数据的聚类散点图
plt.scatter(x_axis, y_axis, c=all_predictions)
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/f00d32457e9f73c1b97ca0eff602aebb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/79bae5f6181f75e59851f3dc37f02a41.png)
四,也可以聚成两类:
#将类别参数改成2
model = KMeans(n_clusters=2)
![](https://i-blog.csdnimg.cn/blog_migrate/584c3d638c0410c68b57bba8df0c94b8.png)
五,kmeans算法流程
1)随机选取k个点作为种子点(这k个点不一定属于数据集,k个点就代表有k类)
2)分别计算每个数据点到k个种子点的距离,离哪个种子点最近,就属于哪类
3)重新计算k个种子点的坐标(简单常用的方法是求坐标值的平均值作为新的坐标值)
4)重复2、3步,直到种子点坐标不变或者循环次数完成
![è¿éåå¾çæè¿°](https://i-blog.csdnimg.cn/blog_migrate/9b13718877a2f0fbe00e7c7cce5baedd.gif)
六,kmeans的不足
1)初始分类数目k值很难估计,不确定应该分成多少类才最合适(ISODATA算法通过类的自动合并和分裂,得到较为合理的类型数目k)(meanshift也可以不用提前知道分多少类别,参考博文:https://blog.csdn.net/u010916338/article/details/86495308)
2)不同的随机种子会得到完全不同的结果(K-Means++算法可以用来解决这个问题,其可以有效地选择初始点)
|