您的位置:首页 > 其它

机器学习【三】无监督学习-聚类算法-Kmeans

2018-03-12 17:05 411 查看
1.K-meansK-means,属于无监督学习。即输入数据没有标签y,经过一些算法后,找到标签y。聚类的目的就是找到每个样本潜在的标签y,并将同类别的样本放到一起。k-means聚类:就是把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。每一个样本有多个特征,下图表示的是两个特征的情况下


2.优化目标



3.算法


输入无x0,且没有y,也就是无标记


这里引用一篇知名博主程sir的解释

首先输入k的值,即我们希望将数据集经过聚类得到k个分组。
从数据集中随机选择k个数据点作为初始大哥(质心,Centroid)
对集合中每一个小弟,计算与每一个大哥的距离(距离的含义后面会讲),离哪个大哥距离近,就跟定哪个大哥。
这时每一个大哥手下都聚集了一票小弟,这时候召开人民代表大会,每一群选出新的大哥(其实是通过算法选出新的质心)。
如果新大哥和老大哥之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),可以认为我们进行的聚类已经达到期望的结果,算法终止。
如果新大哥和老大哥距离变化很大,需要迭代3~5步骤。

4.随机初始化


可能会卡在局部最优


多次随机初始化算法


5.选择聚类数目使用下图左边的肘部法则,但是很多情况,都会出现右侧的情况,所以不是很实用   


6.代码实例
cousera上有matlab实现此算法的代码,很好,我也动手尝试了,要求完整实现代码逻辑。这里用其它教程使用sklearn包来一个函数解决
1.数据实例



2.数据文件 city.txt北京,2959.19,730.79,749.41,513.34,467.87,1141.82,478.42,457.64
天津,2459.77,495.47,697.33,302.87,284.19,735.97,570.84,305.08
河北,1495.63,515.90,362.37,285.32,272.95,540.58,364.91,188.63
山西,1406.33,477.77,290.15,208.57,201.50,414.72,281.84,212.10
内蒙古,1303.97,524.29,254.83,192.17,249.81,463.09,287.87,192.96
辽宁,1730.84,553.90,246.91,279.81,239.18,445.20,330.24,163.86
吉林,1561.86,492.42,200.49,218.36,220.69,459.62,360.48,147.76
黑龙江,1410.11,510.71,211.88,277.11,224.65,376.82,317.61,152.85
上海,3712.31,550.74,893.37,346.93,527.00,1034.98,720.33,462.03
江苏,2207.58,449.37,572.40,211.92,302.09,585.23,429.77,252.54
浙江,2629.16,557.32,689.73,435.69,514.66,795.87,575.76,323.36
安徽,1844.78,430.29,271.28,126.33,250.56,513.18,314.00,151.39
福建,2709.46,428.11,334.12,160.77,405.14,461.67,535.13,232.29
江西,1563.78,303.65,2
4000
33.81,107.90,209.70,393.99,509.39,160.12
山东,1675.75,613.32,550.71,219.79,272.59,599.43,371.62,211.84
河南,1427.65,431.79,288.55,208.14,217.00,337.76,421.31,165.32
湖南,1942.23,512.27,401.39,206.06,321.29,697.22,492.60,226.45
湖北,1783.43,511.88,282.84,201.01,237.60,617.74,523.52,182.52
广东,3055.17,353.23,564.56,356.27,811.88,873.06,1082.82,420.81
广西,2033.87,300.82,338.65,157.78,329.06,621.74,587.02,218.27
海南,2057.86,186.44,202.72,171.79,329.65,477.17,312.93,279.19
重庆,2303.29,589.99,516.21,236.55,403.92,730.05,438.41,225.80
四川,1974.28,507.76,344.79,203.21,240.24,575.10,430.36,223.46
贵州,1673.82,437.75,461.61,153.32,254.66,445.59,346.11,191.48
云南,2194.25,537.01,369.07,249.54,290.84,561.91,407.70,330.95
西藏,2646.61,839.70,204.44,209.11,379.30,371.04,269.59,389.33
陕西,1472.95,390.89,447.95,259.51,230.61,490.90,469.10,191.34
甘肃,1525.57,472.98,328.90,219.86,206.65,449.69,249.66,228.19
青海,1654.69,437.77,258.78,303.00,244.93,479.53,288.56,236.51
宁夏,1375.46,480.89,273.84,317.32,251.08,424.75,228.73,195.93
新疆,1608.82,536.05,432.46,235.82,250.28,541.30,344.85,214.403.代码import numpy as np
from sklearn.cluster import KMeans

def loadData(filePath):
fr = open(filePath,'r+',encoding='utf8')
lines = fr.readlines()
reData = [] #用来存储城市的各项消费信息
reCityName = [] #用来存储城市名称
for line in lines:
items = line.strip().split(",")
reCityName.append(items[0])
reData.append([float(items[i]) for i in range(1,len(items))])
return reData,reCityName

if __name__ == '__main__':
data,cityName = loadData('city.txt')
km = KMeans(n_clusters=4) #分为4类
label = km.fit_predict(data) # 计算簇中心以及为簇分配序号,label为每行数据对应分配到的序列
print('label\n', label)
#求得的label就是一个列表,里面就是结果,结果是每个样本属于哪一个分类

expenses = np.sum(km.cluster_centers_, axis=1) # 按行求和
print('km.cluster_centers_\n', km.cluster_centers_) #四个类别,每个类别的中心坐标
print('expenses\n', expenses, '\n\n') #将四个类别每个类别的所有特征求和

CityCluster = [[], [], [], []]
# 将在同一个簇的城市保存在同一个list中
for i in range(len(cityName)):
CityCluster[label[i]].append(cityName[i])
# 输出各个簇的平均消费数和对应的城市名称
for i in range(len(CityCluster)):
print("Expenses:%.2f" % expenses[i])
print(CityCluster[i])4.运行结果label
[3 1 0 0 0 0 0 0 3 2 1 2 1 0 0 0 2 2 3 2 2 1 2 0 2 1 0 0 0 0 0]
km.cluster_centers_
[[1525.81533333 478.672 322.88266667 232.4 236.41866667
457.53133333 344.81866667 190.21933333]
[2549.658 582.118 488.366 268.998 397.442
618.92 477.946 295.172 ]
[2004.785 429.48 347.8925 190.955 287.66625
581.16125 437.2375 233.09625 ]
[3242.22333333 544.92 735.78 405.51333333 602.25
1016.62 760.52333333 446.82666667]]
expenses
[3788.758 5678.62 4512.27375 7754.65666667]

Expenses:3788.76
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '江西', '山东', '河南', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆']
Expenses:5678.62
['天津', '浙江', '福建', '重庆', '西藏']
Expenses:4512.27
['江苏', '安徽', '湖南', '湖北', '广西', '海南', '四川', '云南']
Expenses:7754.66
['北京', '上海', '广东']
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习