点与聚类匹配(K均值算法)
步骤:
- 分配
将点按照离聚类中心的距离分好
- 优化
移动使聚类中心到这些点的总二次距离降到最小
3.重复上述步骤
可视化工具中来看具体操作:
随机放中心,对点按距离分类
移动中心至其点的总二次距离最小的位置,再次对点分类
再次移动中心至点的总二次距离最小的位置
SKlearn Clustering
Method name —— K-Means
注意:必须在一开始就表明要查找的聚类数(最具挑战性的工作)
需要注意的参数:
n_clusters(聚类数量,默认为8)
根据自己的需要反复调整(基本需要调整)最重要的参数max_iter=300
在查找聚类时,需要进行迭代,将各个点分配到矩心,然后移动矩心,然后重新分配这些点,重新移动矩心。max_iter表示进行迭代的次数,300一般足够了。n_init=10 控制算法初始化的次数,提出聚类的次数
k-means聚类有一个挑战——完全取决于初始状况,你有时最终会得到不同的聚类结果,然后,你需要多次重复该算法。尽管任意这些聚类可能都不对,但所有聚类的集合总会有满足你要求的聚类。
如果觉得你的聚类特别容易出现糟糕或艰难的初始化过程,就需要调整这个参数
class sklearn.cluster.KMeans(n_clusters=8, init=’k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm=’auto’)
K-均值的局限
同一个训练集训练出的模型总是会预测出同样的结果吗?
不是
K-均值是爬山算法,他非常依赖于你的初始聚类中心所处的位置局部最小值:取决于聚类中心点的最初设定
例子1:
在这个例子中,如果你在最初的假设中选择了这三个聚类中心,你将很难离开这些点。
因此我们必须意识到,在聚类中,这是一个局部的爬山算法,它可以为你提供一个次优解。如果你对它再次进行拆分,就可以得到更好的解
例子2:
如果以两个聚类中心对这组数据进行初始化处理,这里存不存在一个局部最小值?有没有稳定的解?
这里也是存在不好的局部最小值的!!
你可以把这些聚类中心设置的正好位于彼此的上方,分割线如下图所示,所有上方的点与上方的聚类中心相关联,下方的点与下方的聚类中心相关联
如果你的越多的聚类中心,就能找到越多的局部最小值
但是特殊的情况其实存在,所以得用这个将算法多次运行
19.你的聚类算法将会用到哪些特征?
散点图:
- 20.部署聚类
代码:
feature_1 = "salary"
feature_2 = "exercised_stock_options"
poi = "poi"
features_list = [poi, feature_1, feature_2]
data = featureFormat(data_dict, features_list )
poi, finance_features = targetFeatureSplit( data )
from sklearn.cluster import KMeans
import numpy as np
Kmeans = KMeans(n_clusters=2).fit(finance_features)
pred=Kmeans.predict(finance_features)
- 21.使用3个聚类特征,有测试点移动到不同的聚类中吗?
代码:
feature_1 = "salary"
feature_2 = "exercised_stock_options"
feature_3 = "total_payments"
poi = "poi"
features_list = [poi, feature_1, feature_2, feature_3]
data = featureFormat(data_dict, features_list )
poi, finance_features = targetFeatureSplit( data )
from sklearn.cluster import KMeans
import numpy as np
Kmeans = KMeans(n_clusters=2).fit(finance_features)
pred=Kmeans.predict(finance_features)
### in the "clustering with 3 features" part of the mini-project,
### you'll want to change this line to
### for f1, f2, _ in finance_features:
### (as it's currently written, the line below assumes 2 features)
for f1, f2, f3 in finance_features:
plt.scatter( f1, f2, f3 )
plt.show()
- 22.股票期权范围
import numpy as np
stocklist=[]
for item in data_dict:
stock = data_dict[item]['exercised_stock_options']
if stock != 'NaN':
stocklist.append(stock)
stocklist = np.array(stocklist)
print "max:",np.max(stocklist)
print "min:",np.min(stocklist)
max: 34348384
min: 3285
- 23.薪酬范围
salarylist=[]
for item in data_dict:
stock = data_dict[item]['salary']
if stock != 'NaN':
salarylist.append(stock)
salarylist = np.array(salarylist)
print "max:",np.max(salarylist)
print "min:",np.min(salarylist)
max: 1111258
min: 477
- 24.练习: 聚类更改