瑛太来笔试

python的可迭代对象和迭代器的区别

1 iterable是一个能返回它的成员的对象。包括sequence types(list,str,tuple) and not-sequence types(dict, file objects), objects and classed defined with an iter() method or a getitem() method

当一个iterable object传入 iter()方法(同样是调用__iter__()方法的时候)的时候,会返回一个iterator. 这是显式创建iterator的方法。当我们用for遍历的时候,iterator会自动创建iterator

2 iterator应该定义一个__iter__()方法(或者一个供迭代的生成器),由于有这个方法都是iterable的,所以iterator都是iterable的

iterator的__iter__()方法返回的是iterator object itself

为什么iterator都是iterable的?因为iterator(比如list)都是可以重复遍历的(想象并发情况下),所以需要每次__iter__()的时候返回一个独立的迭代器。

如果iterator不是iterable的,那么每次调用都只返回同一个iterator,一旦这个iterator到达了StopIteration的条件,就完了

注:用for遍历对象的时候,如果对象没有__iter__,但是实现了__getitem__,会使用下标迭代的方式

iter也是一样,当__iter__方法没有的时候,返回一个用下标迭代的可迭代对象来代替,比如str
https://www.cnblogs.com/meditator/p/7943582.html
iterable对象可以for
iterator可以next(),也可以for
所以iterator都是iterable的。

朴素贝叶斯

贝叶斯的前提:特征是独立的。NB做不了最小二乘。

k-means 中k的选择

1.手肘法
1.1 理论

手肘法的核心指标是SSE(sum of the squared errors,误差平方和),

在这里插入图片描述

其中,Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。

   手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

1.2 实践

我们对预处理后数据.csv 中的数据利用手肘法选取最佳聚类数k。具体做法是让k从1开始取值直到取到你认为合适的上限(一般来说这个上限不会太大,这里我们选取上限为8),对每一个k值进行聚类并且记下对于的SSE,然后画出k和SSE的关系图(毫无疑问是手肘形),最后选取肘部对应的k作为我们的最佳聚类数。

k与SSE的关系图如下:

在这里插入图片描述

显然,肘部对于的k值为4,故对于这个数据集的聚类而言,最佳聚类数应该选4
2. 轮廓系数法
2.1 理论

该方法的核心指标是轮廓系数(Silhouette Coefficient),某个样本点Xi的轮廓系数定义如下:在这里插入图片描述
其中,a是Xi与同簇的其他样本的平均距离,称为凝聚度,b是Xi与最近簇中所有样本的平均距离,称为分离度。而最近簇的定义是在这里插入图片描述
其中p是某个簇Ck中的样本。事实上,简单点讲,就是用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。

求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。2.2 实践

我们同样使用2.1中的数据集,同样考虑k等于1到8的情况,对于每个k值进行聚类并且求出相应的轮廓系数,然后做出k和轮廓系数的关系图,选取轮廓系数取值最大的k作为我们最佳聚类系数
聚类数k与轮廓系数的关系图:在这里插入图片描述
可以看到,轮廓系数最大的k值是2,这表示我们的最佳聚类数为2。但是,值得注意的是,从k和SSE的手肘图可以看出,当k取2时,SSE还非常大,所以这是一个不太合理的聚类数,我们退而求其次,考虑轮廓系数第二大的k值4,这时候SSE已经处于一个较低的水平,因此最佳聚类系数应该取4而不是2。

但是,讲道理,k=2时轮廓系数最大,聚类效果应该非常好,那为什么SSE会这么大呢?在我看来,原因在于轮廓系数考虑了分离度b,也就是样本与最近簇中所有样本的平均距离。为什么这么说,因为从定义上看,轮廓系数大,不一定是凝聚度a(样本与同簇的其他样本的平均距离)小,而可能是b和a都很大的情况下b相对a大得多,这么一来,a是有可能取得比较大的。a一大,样本与同簇的其他样本的平均距离就大,簇的紧凑程度就弱,那么簇内样本离质心的距离也大,从而导致SSE较大。所以,虽然轮廓系数引入了分离度b而限制了聚类划分的程度,但是同样会引来最优结果的SSE比较大的问题,这一点也是值得注意的。、
3. (Calinski-Harabasz准则)
在这里插入图片描述
其中SSB是类间方差

随即森林和GBDT

https://blog.csdn.net/u010089444/article/details/69263546
https://blog.csdn.net/u012155582/article/details/79866245?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

求最大无重复子串的长度

可能多行

s=input()
l=[]
while s:
        l.append(s)
        s=input()
        
for i in l:
        print(i)
        res=1
        leng=len(i)
        dp=[[False]*leng for _ in range(leng)]
        for j in range(leng):
                dp[j][j]=True
        for j in range(leng-2,-1,-1):
                for k in range(j+1,leng):
                        if not i[k] in i[j:k]:
                                dp[j][k]=dp[j][k-1]
                                res=max(res,k-j+1) if dp[j][k] else res
                        else:
                                dp[j][k]=False
        print(res)
                
                        



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值