k-means聚类
2019-04-26 本文已影响0人
Colleen_oh
https://www.jianshu.com/p/dbf3dc4919f7
之前有讲过聚类的理论,这里就不进行讲解了。下面直接上代码
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
#注意:data要是DataFrame格式的
data=pd.DataFrame(data)
#根据手肘图选择最优聚类数k
def n_clusters(data,k_max):#在1到k_max中选择最优k,假如你想看看20类中,哪一个最好,这里的k_max就输入20
SSE = [] # 存放每次结果的误差平方和
for k in range(1,k_max):
estimator = KMeans(n_clusters=k) # 构造聚类器
estimator.fit(data)
SSE.append(estimator.inertia_) # estimator.inertia_获取聚类准则的总和
X = range(1,k_max)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X,SSE,'o-')
plt.show()
#聚类
def cluster(data,k):
mod = KMeans(n_clusters=k, n_jobs = 4, max_iter = 500)#聚成3类数据,并发数为4,最大循环次数为500
mod.fit_predict(data)#y_pred表示聚类的结果
r1 = pd.Series(mod.labels_).value_counts()#聚成3类数据,统计每个聚类下的数据量,并且求出他们的中心
r2 = pd.DataFrame(mod.cluster_centers_)
r = pd.concat([r2, r1], axis = 1)
r.columns = list(data.columns) + [u'类别数目']
print(r)
#给每一条数据标注上被分为哪一类
r = pd.concat([data, pd.Series(mod.labels_, index = data.index)], axis = 1)
r.columns = list(data.columns) + [u'聚类类别']
print(r.head())
return(r)
#r.to_excel(outfile)#写出文件夹
#可视化
r=cluster(data,k)#提取聚类结果
ts = TSNE()
ts.fit_transform(r)#r是聚类结果
ts = pd.DataFrame(ts.embedding_, index = r.index)
a = ts[r[u'聚类类别'] == 0]
plt.plot(a[0], a[1], 'r.')#'r'、'g'、‘b’是代表颜色,后面的.、o、*是选择我们要的点的形状
a = ts[r[u'聚类类别'] == 1]
plt.plot(a[0], a[1], 'go')
a = ts[r[u'聚类类别'] == 2]#这里只画了3类的图,要画5类的就要自己再增加一些代码啦!
plt.plot(a[0], a[1], 'b*')
plt.show()
上面是定义好的,用SSE选择最优聚类数和聚类的代码,记得data的格式是DataFrame,以免出错,我们的数据中不要含有字符串,要保证是数值类型。另外数据要没有空值,在做聚类之前,要处理空值,并且数据要齐全,就是假如你的数据有7列24行,你要确保每一行都有7个数字,不要存在某一行或者某一列缺失(若缺失可以补齐或者删除,根据自己需求)。不然是没有没办计算距离的。
参考:
https://blog.csdn.net/xyisv/article/details/82430107
https://blog.csdn.net/weixin_40683253/article/details/81288900
https://blog.csdn.net/qiurisiyu2016/article/details/80187177