对象、矩阵与矢量化编程

 

# 对象、矩阵与矢量化编程
## 对象与矩阵
### 在机器学习中,对象是指含有一组特征的行向量,利用矩阵将对象进行量化
## 初识矩阵
### 矩阵是具有相同特征和维度的对象集合,表现为一张二维数据表
### 一个对象表示为矩阵中的一行,一个特征表示为矩阵中的一列,每个特征都有数值型的取值
### 特征相同、取值相异的对象集合所构成的矩阵。使对象之间既相互独立,又相互联系
### 由特征列的取值范围所有构成的矩阵空间应具有完整性,即能够反映出事物的空间形式或变化。
### 分类或聚类可以看做根据对象特征的相似性与差异性,对矩阵空间的一种划分
### 预测或回归可以看做根据对象在某种序列(时间)上的相关性,表现为特征取值变化的一种趋势
### 分类、聚类和回归是机器学习的最基本的主题。通过矩阵,可以构建客观事物的多维数学模型,并通过条件概率分布、梯度、神经网络、协方差等运算方式,多角度地认识和分析事物
## 矢量化编程与GPU运算
### 矢量化编程 可以直接将数学公式转换为相应的程序代码,极大的方便了程序的阅读和调试
### GPU芯片在浮点运算、大规模并行计算方面,可以提供数十倍乃至上百倍于CPU的性能
## 理解数学公与NumPy矩阵运算
## Linalg线性代数库

机器学习的几个思考

1、机器与人的区别

人是一种善于利用工具来解决问题、实现目的的动物

人和机器(计算机)对比表现出来的几个缺点:

1、信息存储量

2、对信息的计算速度

3、重复执行

 

2、机器模拟人进行工作

人类的行为是一种根据反馈信息来进行判断,然后去执行。机器模拟此过程,也应该按照这个逻辑进行:

1、机器必须学会辨别物体。物体通常带有一定的特征,人是通过这些特征来识别不同的物体。带有同样特征的,定义为同一类型物体,不同特征的为不同物体。

 

人工智能也一样,必须通过寻找特征、识别特征来识别物体。然后才能进行进一步的操作。

PHP底层学习-源码整体框架 3 PHP源码目录结构

# PHP源码目录
## SAPI目录
### 对输入和输出层的抽象,是PHP提供对外服务的规范
## Zend目录
### 内存管理模块
### 垃圾回收
### 数组实现
## main目录
### 解析SAPI的请求,分析要执行的脚本文件和参数
### 调用Zend引擎之前,完成必要的初始化工作
## ext目录
### PHP扩展相关的目录
## TSRM目录
### 线程安全资源管理器
### PHP的线程安全机制
* 在线程环境下,为每个线程提供独立的全局变量副本
* 具体实施是

通过TSRM为每个线程分配(分配前加锁)一个独立ID(自增)作为当前线程的全局变量内存区索引。

在以后的全局变量访问中,实现线程之间的完成独立

PHP底层学习–源码整体框架 2 PHP7内核架构

分为4部分:

1、Zend引擎(提供基础服务)

词法/语法分析、AST编译和opcodes的执行

变量的设计、内存管理、进程管理等都在Zend引擎实现

2、PHP 层(应用层)

处理来自外部的交互

3、SAPI

Server API。定义PHP输入/输出规范。

4、扩展部分

Zend引擎提供了核心能力和接口规范。在此基础上进行扩展开发。

每日系统设计学习–入门

第一步:回顾可扩展性(scalability)的视频讲座
哈佛大学可扩展性讲座

主题涵盖
垂直扩展(Vertical scaling)
水平扩展(Horizontal scaling)
缓存
负载均衡
数据库复制
数据库分区
第二步:回顾可扩展性文章
可扩展性

主题涵盖:
Clones
数据库
缓存
异步
接下来的步骤
接下来,我们将看看高阶的权衡和取舍:

性能与可扩展性
延迟与吞吐量
可用性与一致性
记住每个方面都面临取舍和权衡。

然后,我们将深入更具体的主题,如 DNS、CDN 和负载均衡器。

PHP底层学习-源码整体框架 1 PHP执行流程

1、词法分析将PHP代码转换为有意义的标识Token。该步骤的词法分析器使用Re2c实现。

2、语法分析将Token和符合文法规则的代码生成抽象语法树。语法分析器基于Bison实现。语法分析使用了BNF来表达文法规则,Bison借助状态机、状态转移表和压栈、出栈等一系列操作,生成抽象语法树。

3、上步的抽象语法树生成对应的opcode,并被虚拟机执行。opcode是PHP7定义的一组指令标识,指令对应着相应的handler(处理函数)。当虚拟机调用opcode,会找到opcode背后的处理函数,执行真正的处理。

leetcode 每日一题:数组– 寻找数组的中心索引

给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。

我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。

如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。

示例 1:

输入:
nums = [1, 7, 3, 6, 5, 6]
输出: 3
解释:
索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。
同时, 3 也是第一个符合要求的中心索引。
示例 2:

输入:
nums = [1, 2, 3]
输出: -1
解释:
数组中不存在满足此条件的中心索引。
说明:

nums 的长度范围为 [0, 10000]。
任何一个 nums[i] 将会是一个范围在 [-1000, 1000]的整数。

code:
public class Main {
public static void main(String[] args) {
int[] nums = {-1,-1,-1,1,1,1};
int result = pivotIndex(nums);
System.out.println(“result:”+result);
}

public static int pivotIndex(int[] nums) {

int length = nums.length;

if( length <= 2 ) { System.out.println("length <= 2"); return -1; } int result = -1; for(int i = 0; i <= length-1; i++) { System.out.println("------------------------"); int sumLeft = sumLeft(nums, i); int sumRight = sumRight(nums, i); if( sumLeft == sumRight) { result = i; break; } } return result; } public static int sumLeft(int[] nums, int i) { int sum = 0; int length = nums.length; for( int j = 0; j < i; j++ ) { sum = sum + nums[j]; } System.out.println("left:"+sum); return sum; } public static int sumRight( int[] nums, int i) { int sum = 0; int length = nums.length; for( int j = length-1; j > i; j– ){
sum = sum + nums[j];
}
System.out.println(“right:”+sum);
return sum;
}
}