day05-轮廓系数-噪声聚类-欧氏距离-皮氏距离-相似度排列-推荐清单-自然语言-词频-文本分类-性别分类
5.轮廓系数:聚类的评价指标
1)概念:
比较好聚类:内密外疏
对于每个样本计算内部距离a和外部距离b,
得到该样本的轮廓系数s=(b-a)/max(a, b),
对所有样本的轮廓系数取平均值,
即为整个样本空间的轮廓系数S=ave(s)。
内部距离a: 一个样本与同聚类其它样本的平均欧氏距离
外部距离b: 一个样本与离其聚类最近的另一个聚类中所有样本的平均欧氏距离。
2)接口:
import sklearn.metrics as sm #评价模块
轮廓系数 = sm.silhouette_score(输入集,输出集,
sample_size=样本数,metric=距离算法)
距离算法:euclidean(欧氏距离)
3)代码:score.py
import numpy as np
import sklearn.cluster as sc
import sklearn.metrics as sm
x= []
with open('../../day01/data/multiple3.txt','r') as f:
for line in f.readlines():
data = [float(substr) for substr in line.split(',')]
x.append(data)
x = np.array(x)
model = sc.KMeans(n_clusters=4)#K均值聚类器
model.fit(x)
pred_y = model.predict(x)#在这里测试并产生预测值
score = sm.silhouette_score(x,pred_y,
sample_size=len(x),metric='euclidean')
print(score) #打印聚类的评价指标:轮廓系数
6.基于密度的带噪声聚类
1)概念:朋友的朋友也是朋友
从样本空间中任意选择一个样本,以事先给定的半径做园,凡是
在该园范围内的样本都视为与该样本处于相同的聚类,以这些被
圈中的样本为圆心继续做园,重复以上过程,不断扩大被圈中的
样本规模,直到再也没有新的样本加入为止,至此即得到一个聚
类。剩余样本中,重复以上过程,直到耗尽样本空间中的所有
样本为止。
这里的园是广义概念的,如在二维平面为园,三维中为球....
2)特点:
1.事先给定的半径会影响最后的聚类效果,
可以借助轮廓系数选择较优的方案。
2.根据聚类的形成过程,把样本分为以下三类:
外周样本:被其他样本聚集到某个聚类中,无法再引入新样本。
孤立样本:聚类中的样本数低于所设定的下限,则不称为聚类,
称为孤立样本。
核心样本:除了外周样本和孤立样本,就是核心样本
3)应用:
如在销售或电商业务中:处于外周或孤立样本的客户,是需要挖掘的
4)接口:
import sklearn.cluster as sc
model = sc.DBSCAN(eps=epsilon,min_sample=5)
eps:半径大小 min_sample:最小样本数,即下限
5)代码示例:dbscan.py
import numpy as np
import sklearn.cluster as sc
import matplotlib.pyplot as mp
import sklearn.metrics as sm
x= []
with open('../../day01/data/perf.txt','r') as f:
for line in f.readlines():
data = [float(substr) for substr in line.split(',')]
x.append(data)
x = np.array(x)
epsilons,scores,models = np.linspace(0.3,1.2,10),[],[]
for epsilon in epsilons:
#构建(DBSCAN)基于密度的带噪声聚类
model = sc.DBSCAN(eps=epsilon,min_samples=5)
model.fit(x)
score = sm.silhouette_score(x,model.labels_,sample_size=len(x),
metric='euclidean') #获得轮廓系数
scores.append(score)
models.append(model)
scores=np.array(scores)
# print(epsilons)
# print(scores) #这样也可得知半径为0.8对应的轮廓系数最好,但需要人为判断
best_index = scores.argmax() #获得最好轮廓系数的下标
best_epsilon = epsilons[best_index] #获得最好轮廓系数对应的半径数据
print(best_epsilon) # 自动获得最好轮廓系数对应的半径数据
best_model = models[best_index] #获得最优的模型
pred_y = best_model.fit_predict(x)
core_mask = np.zeros(len(x),dtype=bool) #核心掩码
core_mask[best_model.core_sample_indices_] = True #获得核心样本
offset_mask = best_model.labels_ == -1 #孤立样本掩码 labels_ = -1的都是孤立样本
peripher_mask = ~(core_mask|offset_mask) #外周样本掩码
mp.figure('DBSCAN',facecolor='lightgray')
mp.title('DBSCAN', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
labels = set(pred_y) #set过滤重复的数据
#将range(len(labels))中对应的元素获得get_cmap对应颜色
cs = mp.get_cmap('brg',len(labels))(range(len(labels)))
mp.scatter(x[core_mask][:, 0], x[core_mask][:, 1],c=cs[pred_y[core_mask]], s=80,label='Core')
mp.scatter(x[offset_mask][:, 0], x[offset_mask][:, 1],edgecolor=cs[pred_y[offset_mask]],
facecolor='none',s=80,label='offset')
mp.scatter(x[peripher_mask][:, 0], x[peripher_mask][:, 1],c=cs[pred_y[peripher_mask]],
marker='*', s=80,label='peripher')
mp.legend()
mp.tight_layout()
mp.show()
十三、推荐引擎
横向推荐:可能是未来需要的;
纵向推荐:曾经用过的,未来可能不在需要。
1.欧氏距离分数
概念:欧氏距离分数=1/(1+欧氏距离)
欧氏距离趋于0,则分数趋于1
欧氏距离趋于+∞,则分数趋于0
分数趋于1,则越相似;分数趋于0,则越不相似。
欧氏距离分数矩阵:
a b c ...
a 1 x x
b x 1 x
c x x 1
...
代码示例:向相似的用户推荐电影
import json
&n
python MachinelEarning机器学习笔记day05
最新推荐文章于 2024-03-22 09:54:52 发布