0%

➜ test ✗ cat DecisionTree.py
from sklearn import tree

# 训练集
X = [[0, 0], [1, 1]]
Y = [0, 1]

# 定义一个DecisionTreeClassifier分类器
clf = tree.DecisionTreeClassifier()

# 拟合X, Y数据
clf.fit(X, Y)

# 预测结果
print(clf.predict([[2, 2]]))
运行, 输出预测结果
➜ test ✗ python3 DecisionTree.py
[1]

# import svm from sklearn
from sklearn import svm

# 创建训练集
X = [[0, 0], [1, 1]]
Y = [0, 1]

# 创建SVC分类器
clf = svm.SVC(kernel = 'linear')

# 对训练数据进行拟合
clf.fit(X, Y)

# 进行预测, 输出结果
print(clf.predict([[2, 2]]))
run it
➜ test ✗ python3 svm.py
[1]

Example

得到癌症的概率是1%, 敏感性和特殊性都是90%, 癌症测试结果呈阳性的人患病的概率有多大?
得到癌症的概率:P(C) = 0.01
SENSITIVITY = 90%, 敏感性, 在P(C)中, 诊断的准确率为90%, 10%的人可能患有癌症, 却被诊断成正常人.
SPECITIVITY = 90%, 特异性, 在P(¬C)中, 诊断的正确率为90%, 10%的正常人被误诊为有癌症.

画图分析

上图中, C表示患有癌症的人, C Pos表示患有癌症且被确诊的人, Pos Bu ¬表示被误诊为癌症的正常人.

问题: 癌症测试结果呈阳性的人患病的概率有多大?

假设这里一共有总共有1000个人(All_People)
Pos But ¬(正常人被误诊) = All_People * (1 - SPECITIVITY)
                       = 1000 * (1 - 0.9)
                       = 100
C(实际患有癌症的人) = All_People * P(C)
                   = 1000 * 0.01
                   = 10

C Pos(实际上患有癌症且被确诊的人) = C * SENSITIVITY
                                = 10 * 0.9
                                = 9

癌症测试结果呈阳性的所有人 = (C Pos(实际上患有癌症且被确诊的人)) + (Pos But ¬(正常人被误诊))
                         = 9 + 100
                         = 109

癌症测试结果呈阳性的人患病的概率 = (C Pos(实际上患有癌症且被确诊的人) ) / (癌症测试结果呈阳性的所有人)
                               = 9 / 109
                               = 0.083(四舍五入到小数点后三位)

先验与后验

Prior Probability(校验之前所得到的概率) * Test Evidence(测试本身获得的一些证据) = Posterior Probability(后验概率)
将测试中的某些证据加入先验概率中, 以获得联合概率.

Prior(先验)

癌症的先验概率: P(C) = 0.01 = 1%
非癌症的先验概率: P(¬C) = 1 − P(C)
 = 0.99
SENSITIVITY(敏感性): P(Pos | C) = 0.9 = 90%
SPECITIVITY(特异性): P(Neg | ¬C) = 0.9 = 90%
被误诊为癌症概率: P(Pos | ¬C) = 1 − SPECITIVITY
                             = 0.1

Joint(联合概率)

癌症的联合概率: P(C, Pos) = P(C) * SENSITIVITY
                              = 0.01 * 0.9
                              = 0.009
非癌症的联合概率: P(¬C, Pos) = P(¬C) * P(Pos | ¬C)
                            = 0.99 * 0.1
                            = 0.099

Normalization(归一化)

数字归一, 比例保持不变, 确保他们相加之和为1.
后验概率求和 = 癌症的后验概率 + 非癌症的后验概率
检测为阳性的概率: P(Pos) = P(C, Pos) + P(¬C, Pos)
                        = 0.009 + 0.099
                        = 0.108

Posterior(后验概率)

癌症的后验概率: P(C | Pos) = 癌症的联合概率 / 检测为阳性的概率
                               = (P(C, Pos)) / (P(Pos))
                               = 0.009 / 0.108
                               = 0.0833
非癌症的后验概率: P(¬C | Pos) = 非癌症的联合概率 / 检测为阳性的概率
                             = (P(¬C, Pos)) / (P(Pos))
                             = 0.099 / 0.108
                             = 0.9167
后验概率求和: 癌症的后验概率 + 非癌症的后验概率 = P(C | Pos) + P(¬C | Pos)
                                             = 0.0833 + 0.9167
                                             = 1

  • 前段时间在琢磨着怎么从Oray的付费用户中脱离出来, 在网上徘徊了许久, 最后选择了直接从AliyunDNS的接口去自己实现一个DDNS服务, 其中有些代码来自网络, 对其修改并做了一部分优化, 目前还比较稳定的跑在内网服务器上, github地址https://github.com/kylechenoO/aliddns, 附上代码与注释:

[python]

-- coding: UTF-8 --

请使用Python2.X来执行此脚本

import json
import os
import re
import sys
import requests
from datetime import datetime
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest, DescribeDomainRecordsRequest, \
DescribeDomainRecordInfoRequest
from aliyunsdkcore import client

请填写你的Access Key ID

access_key_id = ‘XXX’

请填写你的Access Key Secret

access_Key_secret = ‘XXX’

请填写你的账号ID

account_id = ‘XXX’

请填写你的一级域名

rc_domain = ‘XXX.com’

请填写你的解析记录

rc_rr = ‘www’

请填写你的记录类型,DDNS请填写A,表示A记录

rc_type = ‘A’

请填写解析记录ID(可以先check_records()获取ID再填写这里)

rc_record_id = ‘XXX’

请填写解析有效生存时间TTL,单位:秒

rc_ttl = ‘600’

请填写返还内容格式,json,xml

rc_format = ‘json’

获取当前IP地址, 有多种方式实现, 我这边最快的是seip.cc就用它了

def my_ip():
get_ip_method = os.popen(‘curl -s seip.cc’)
get_ip_responses = get_ip_method.readlines()[0]
get_ip_pattern = re.compile(r’\d .\d .\d .\d ‘)
get_ip_value = get_ip_pattern.findall(get_ip_responses)[0]
return(get_ip_value)

获取所有记录与相关信息, 包含rc_record_id

def check_records(dns_domain):
clt = client.AcsClient(access_key_id, access_Key_secret, ‘cn-hangzhou’)
request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
request.set_DomainName(dns_domain)
request.set_accept_format(rc_format)
result = clt.do_action_with_exception(request)
return(result)

获取原来的DNS记录值

def old_ip():
clt = client.AcsClient(access_key_id, access_Key_secret, ‘cn-hangzhou’)
request = DescribeDomainRecordInfoRequest.DescribeDomainRecordInfoRequest()
request.set_RecordId(rc_record_id)
request.set_accept_format(rc_format)
result = clt.do_action_with_exception(request)
result = json.JSONDecoder().decode(result)
result = result[‘Value’]
return(result)

更新DNS记录信息

def update_dns(dns_rr, dns_type, dns_value, dns_record_id, dns_ttl, dns_format):
clt = client.AcsClient(access_key_id, access_Key_secret, ‘cn-hangzhou’)
request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
request.set_RR(dns_rr)
request.set_Type(dns_type)
request.set_Value(dns_value)
request.set_RecordId(dns_record_id)
request.set_TTL(dns_ttl)
request.set_accept_format(dns_format)
result = clt.do_action_with_exception(request)
return(result)

将每次IP变动的过程写入日志文件, 以便后续分析

def write_to_file():
time_now = datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’)
current_script_path = sys.path[7]
print(current_script_path)
log_file = current_script_path ‘/‘ ‘aliyun_ddns_log.txt’
write = open(log_file, ‘a’)
write.write(time_now ‘ ‘ str(rc_value) ‘\n’)
write.close()
return(True)

mail run parts

if name == ‘main‘:

如果你是第一次运行, 请先执行check_records, 获取相关rc_record_id, 完善文件头中的变量信息后再执行后续操作

print check_records(rc_domain)

rc_value = my_ip()

获取当前IP

rc_value = my_ip()

获取当前DNS记录值

rc_value_old = old_ip()

如果当前IP与DNS记录值一致, 则不更新记录

if rc_value_old == rc_value:
print(‘The specified value of parameter Value is the same as old’)

否则更新记录, 写入日志文件

else:
print(update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl, rc_format))
write_to_file()
[/python]

Naive Bayes Basic

用sklearn去拟合NB模型


[shell]➜ test ✗ cat nb.py[/shell]
[python]
import numpy as np
from sklearn.naive_bayes import GaussianNB

创建训练坐标(输入X求得Y)

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])

创建Naive Bayes分类器

clf = GaussianNB()

对数据进行拟合

clf.fit(X, Y)

进行预测, 输出结果

print(clf.predict([[-0.8, -1]]))
[/python]

预测结果


[shell]➜ test ✗ python3 nb.py
[1]
[/shell]

ottertune的controller部分需要使用Gradle build project, 需要先安装sdkman, 整个安装过程如下.

Official Gradle Installation Doc

dkman Installation Doc

1.安装Java/JDK

[root@ottertune ~]# yum install java-1.8.0* -y

2.下载执行安装脚本

[root@ottertune ~]# curl -s “https://get.sdkman.io“ | bash

3.初始化环境变量

[root@ottertune ~]# source “$HOME/.sdkman/bin/sdkman-init.sh”

4.确认是否安装成功

[root@ottertune ~]# sdk version

SDKMAN 5.6.2+294

5.安装Gradle

[root@ottertune ~]# sdk install gradle 4.6

Downloading: gradle 4.6

In progress…

################################################################## 100.0%

Installing: gradle 4.6
Done installing!

Setting gradle 4.6 as default.

6.查看gradle安装版本

[root@ottertune ~]# gradle -v

Gradle 4.6
——————————————————————————————</code>

Build time: 2018-02-28 13:36:36 UTC
Revision: 8fa6ce7945b640e6168488e4417f9bb96e4ab46c

Groovy: 2.4.12
Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM: 1.8.0_161 (Oracle Corporation 25.161-b14)
OS: Linux 3.10.0-693.17.1.el7.x86_64 amd64

大家好, 我是Kyle Chen, 自动化研发汉纸一枚, 截止目前, 有十五年Linux/Unix这块的使用, 研发经验, 目前对机器学习这块的项目特别感兴趣. 抱着不断学习的态度, 也在持续输入输出, 这里的文章都为原创, 一方面是为了怕自己年纪大了容易遗忘, 一方面可以与各位读者做个交流, 如果有地方写的不对的还请联系, 可以直接在文章下留言.  Email: kyle@hacking-linux.com 随时欢迎技术研讨.