作业说明
任务1:对地理数据应用二分k-均值算法聚类。
问题:你的朋友Drew希望你带他去城里庆祝他的生日。由于其他一些朋友也会过来,所以需要你提供一个大家都可行的计划。Drew给了你希望去的69个地址和相应的经纬度。你要决定将这些地方进行聚类的最佳策略,这样可以安排交通工具抵达这些簇的质心,然后步行到每个簇内地址。
准备数据:用Python解析文本文件,根据经纬度信息计算球面距离。
分析数据:使用Matplotlib构建一个二维数据图,其中包含簇与地图
聚类算法:应用二分k-均值算法,最后的输出是包含簇及簇中心的地图。
任务2:根据用户采集的WiFi信息对用户进行聚类。数据集是之前作业里的经典WiFi信息数据。
由于聚类的作业是考完试之后再布置的,基本上没有什么印象了
任务1:对地理数据应用二分k-均值算法聚类
不记得这个作业怎么搞的了,也可能是作业里直接给出了代码?直接贴代码吧
# numClust为簇数目
def clusterClubs(numClust=5):
datList = []
#导入数据
for line in open('places.txt').readlines():
lineArr = line.split('\t')
datList.append([float(lineArr[4]), float(lineArr[3])])
datMat = mat(datList)
#采用二分k-均值算法进行聚类
myCentroids, clustAssing = biKmeans(datMat, numClust, distMeas=distSLC)
#定义画布,背景
fig = plt.figure()
rect = [0.0, 0.0, 1.0, 1.0]
scatterMarkers = ['s', 'o', '^', '8', 'p', 'd', 'v', 'h', '>', '<']
axprops = dict(xticks=[], yticks=[])
ax0 = fig.add_axes(rect, label='ax0', **axprops)
imgP = plt.imread('Portland.png')
ax0.imshow(imgP)
ax1 = fig.add_axes(rect, label='ax1', frameon=False)
for i in range(numClust):
ptsInCurrCluster = datMat[nonzero(clustAssing[:, 0].A == i)[0], :]
markerStyle = scatterMarkers[i % len(scatterMarkers)]
ax1.scatter(ptsInCurrCluster[:, 0].flatten().A[0], ptsInCurrCluster[:, 1].flatten().A[0], marker=markerStyle, s=90)
ax1.scatter(myCentroids[:, 0].flatten().A[0], myCentroids[:, 1].flatten().A[0], marker='+', s=300)
plt.show()
任务2:根据用户采集的WiFi信息对用户进行聚类
聚类也可以用 sklearn库中的函数搞定,比如最经典的kmeans算法
from sklearn.cluster import KMeans
数据的处理就按照之前的代码稍微改一下就好了
def clusterAnalysis(mod, featureData):
# 聚成4类数据,统计每个聚类下的数据量,并且求出他们的中心
r1 = pd.Series(mod.labels_).value_counts()
r2 = pd.DataFrame(mod.cluster_centers_)
r = pd.concat([r2, r1], axis=1)
r.columns = list(featureData.columns) + [u'类别数目']
# print(r)
# 给每一条数据标注上被分为哪一类
r = pd.concat([featureData, pd.Series(mod.labels_, index=featureData.index)], axis=1)
r.columns = list(featureData.columns) + [u'聚类类别']
# print(r.head())
return r
def clusterVisual(r, k):
# 可视化过程
ts = TSNE()
ts.fit_transform(r)
ts = pd.DataFrame(ts.embedding_, index=r.index)
tagList = ['r.', 'go', 'b*', 'k+', 'yD']
for i in range(k):
a = ts[r[u'聚类类别'] == i]
plt.plot(a[0], a[1], tagList[i])
plt.show()
不要问这个函数是什么意思,问就是参考别人的。我也不记得了