python MachinelEarning机器学习笔记day05

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值